From 04ddbb6ac7f6a28d8979f279152ed2caa51e7df1 Mon Sep 17 00:00:00 2001 From: playerterra1 Date: Thu, 31 Oct 2024 13:53:55 +0000 Subject: [PATCH] change data structure for novel type --- lib/l10n/app_de.arb | 1 + lib/l10n/app_en.arb | 3 + lib/models/category.dart | 10 +- lib/models/category.g.dart | 117 +- lib/models/manga.dart | 12 + lib/models/manga.g.dart | 159 +- lib/models/settings.dart | 29 +- lib/models/settings.g.dart | 1522 ++++++++++- lib/models/source.dart | 7 + lib/models/source.g.dart | 175 +- lib/modules/library/library_screen.dart | 172 +- .../library/providers/isar_providers.dart | 12 +- .../library/providers/isar_providers.g.dart | 62 +- .../providers/library_state_provider.dart | 345 ++- .../providers/library_state_provider.g.dart | 541 ++-- .../library/providers/local_archive.dart | 15 +- .../library/providers/local_archive.g.dart | 30 +- .../widgets/library_gridview_widget.dart | 12 +- .../widgets/library_listview_widget.dart | 4 +- lib/modules/main_view/main_screen.dart | 4 +- .../manga/detail/manga_detail_view.dart | 7 +- .../manga/detail/manga_details_view.dart | 4 +- lib/modules/manga/home/manga_home_screen.dart | 2 +- .../manga/reader/providers/push_router.dart | 31 +- .../more/categories/categories_screen.dart | 16 +- .../categories/providers/isar_providers.dart | 5 +- .../providers/isar_providers.g.dart | 31 +- lib/modules/novel/novel_reader_view.dart | 2424 +++++++++++++++++ lib/router/router.dart | 46 +- lib/services/aniskip.g.dart | 2 +- lib/services/trackers/anilist.g.dart | 2 +- 31 files changed, 5008 insertions(+), 794 deletions(-) create mode 100644 lib/modules/novel/novel_reader_view.dart diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index f050dd0c..34f82d9b 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -187,6 +187,7 @@ "anime_sources": "Anime-Quellen", "anime_extensions": "Anime-Erweiterungen", "manga_extensions": "Manga-Erweiterungen", + "novel": "Novel", "anime": "Anime", "manga": "Manga", "library_no_category_exist": "Sie haben noch keine Kategorien", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 4cf4040b..8a108f88 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -208,10 +208,13 @@ "n_episodes": "{n} episodes", "manga_sources": "Manga Sources", "anime_sources": "Anime Sources", + "novel_sources": "Novel Sources", "anime_extensions": "Anime Extensions", "manga_extensions": "Manga Extensions", + "novel_extensions": "Novel Extensions", "anime": "Anime", "manga": "Manga", + "novel": "Novel", "library_no_category_exist": "You don't have any categories yet", "watching": "Watching", "plan_to_watch": "Plan to watch", diff --git a/lib/models/category.dart b/lib/models/category.dart index fddee082..306a1352 100644 --- a/lib/models/category.dart +++ b/lib/models/category.dart @@ -1,4 +1,5 @@ import 'package:isar/isar.dart'; +import 'package:mangayomi/models/manga.dart'; part 'category.g.dart'; @collection @@ -6,18 +7,19 @@ part 'category.g.dart'; class Category { Id? id; String? name; - bool? forManga; + @enumerated + late ItemType forItemType; Category( {this.id = Isar.autoIncrement, required this.name, - required this.forManga}); + required this.forItemType}); Category.fromJson(Map json) { id = json['id']; name = json['name']; - forManga = json['forManga']; + forItemType = json['forItemType']; } Map toJson() => - {'id': id, 'name': name, 'forManga': forManga}; + {'id': id, 'name': name, 'forItemType': forItemType}; } diff --git a/lib/models/category.g.dart b/lib/models/category.g.dart index ab1f0ee1..8dcbd4ec 100644 --- a/lib/models/category.g.dart +++ b/lib/models/category.g.dart @@ -17,10 +17,11 @@ const CategorySchema = CollectionSchema( name: r'Category', id: 5751694338128944171, properties: { - r'forManga': PropertySchema( + r'forItemType': PropertySchema( id: 0, - name: r'forManga', - type: IsarType.bool, + name: r'forItemType', + type: IsarType.byte, + enumMap: _CategoryforItemTypeEnumValueMap, ), r'name': PropertySchema( id: 1, @@ -63,7 +64,7 @@ void _categorySerialize( List offsets, Map> allOffsets, ) { - writer.writeBool(offsets[0], object.forManga); + writer.writeByte(offsets[0], object.forItemType.index); writer.writeString(offsets[1], object.name); } @@ -74,7 +75,9 @@ Category _categoryDeserialize( Map> allOffsets, ) { final object = Category( - forManga: reader.readBoolOrNull(offsets[0]), + forItemType: + _CategoryforItemTypeValueEnumMap[reader.readByteOrNull(offsets[0])] ?? + ItemType.manga, id: id, name: reader.readStringOrNull(offsets[1]), ); @@ -89,7 +92,8 @@ P _categoryDeserializeProp

( ) { switch (propertyId) { case 0: - return (reader.readBoolOrNull(offset)) as P; + return (_CategoryforItemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? + ItemType.manga) as P; case 1: return (reader.readStringOrNull(offset)) as P; default: @@ -97,6 +101,17 @@ P _categoryDeserializeProp

( } } +const _CategoryforItemTypeEnumValueMap = { + 'manga': 0, + 'anime': 1, + 'novel': 2, +}; +const _CategoryforItemTypeValueEnumMap = { + 0: ItemType.manga, + 1: ItemType.anime, + 2: ItemType.novel, +}; + Id _categoryGetId(Category object) { return object.id ?? Isar.autoIncrement; } @@ -186,32 +201,60 @@ extension CategoryQueryWhere on QueryBuilder { extension CategoryQueryFilter on QueryBuilder { - QueryBuilder forMangaIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'forManga', - )); - }); - } - - QueryBuilder forMangaIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'forManga', - )); - }); - } - - QueryBuilder forMangaEqualTo( - bool? value) { + QueryBuilder forItemTypeEqualTo( + ItemType value) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( - property: r'forManga', + property: r'forItemType', value: value, )); }); } + QueryBuilder + forItemTypeGreaterThan( + ItemType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'forItemType', + value: value, + )); + }); + } + + QueryBuilder forItemTypeLessThan( + ItemType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'forItemType', + value: value, + )); + }); + } + + QueryBuilder forItemTypeBetween( + ItemType lower, + ItemType upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'forItemType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder idIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -434,15 +477,15 @@ extension CategoryQueryLinks on QueryBuilder {} extension CategoryQuerySortBy on QueryBuilder { - QueryBuilder sortByForManga() { + QueryBuilder sortByForItemType() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'forManga', Sort.asc); + return query.addSortBy(r'forItemType', Sort.asc); }); } - QueryBuilder sortByForMangaDesc() { + QueryBuilder sortByForItemTypeDesc() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'forManga', Sort.desc); + return query.addSortBy(r'forItemType', Sort.desc); }); } @@ -461,15 +504,15 @@ extension CategoryQuerySortBy on QueryBuilder { extension CategoryQuerySortThenBy on QueryBuilder { - QueryBuilder thenByForManga() { + QueryBuilder thenByForItemType() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'forManga', Sort.asc); + return query.addSortBy(r'forItemType', Sort.asc); }); } - QueryBuilder thenByForMangaDesc() { + QueryBuilder thenByForItemTypeDesc() { return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'forManga', Sort.desc); + return query.addSortBy(r'forItemType', Sort.desc); }); } @@ -500,9 +543,9 @@ extension CategoryQuerySortThenBy extension CategoryQueryWhereDistinct on QueryBuilder { - QueryBuilder distinctByForManga() { + QueryBuilder distinctByForItemType() { return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'forManga'); + return query.addDistinctBy(r'forItemType'); }); } @@ -522,9 +565,9 @@ extension CategoryQueryProperty }); } - QueryBuilder forMangaProperty() { + QueryBuilder forItemTypeProperty() { return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'forManga'); + return query.addPropertyName(r'forItemType'); }); } diff --git a/lib/models/manga.dart b/lib/models/manga.dart index 19b05931..2465e0e7 100644 --- a/lib/models/manga.dart +++ b/lib/models/manga.dart @@ -24,6 +24,9 @@ class Manga { bool? isManga; + @enumerated + late ItemType itemType; + List? genre; bool? favorite; @@ -63,6 +66,7 @@ class Manga { required this.status, required this.description, this.isManga = true, + this.itemType = ItemType.manga, this.dateAdded, this.lastUpdate, this.categories, @@ -84,6 +88,7 @@ class Manga { imageUrl = json['imageUrl']; isLocalArchive = json['isLocalArchive']; isManga = json['isManga']; + itemType = ItemType.values[json['itemType']]; lang = json['lang']; lastRead = json['lastRead']; lastUpdate = json['lastUpdate']; @@ -107,6 +112,7 @@ class Manga { 'imageUrl': imageUrl, 'isLocalArchive': isLocalArchive, 'isManga': isManga, + 'itemType': itemType.index, 'lang': lang, 'lastRead': lastRead, 'lastUpdate': lastUpdate, @@ -126,3 +132,9 @@ enum Status { onHiatus, publishingFinished } + +enum ItemType { + manga, + anime, + novel +} diff --git a/lib/models/manga.g.dart b/lib/models/manga.g.dart index 3b11ebd4..19d099d5 100644 --- a/lib/models/manga.g.dart +++ b/lib/models/manga.g.dart @@ -77,38 +77,44 @@ const MangaSchema = CollectionSchema( name: r'isManga', type: IsarType.bool, ), - r'lang': PropertySchema( + r'itemType': PropertySchema( id: 12, + name: r'itemType', + type: IsarType.byte, + enumMap: _MangaitemTypeEnumValueMap, + ), + r'lang': PropertySchema( + id: 13, name: r'lang', type: IsarType.string, ), r'lastRead': PropertySchema( - id: 13, + id: 14, name: r'lastRead', type: IsarType.long, ), r'lastUpdate': PropertySchema( - id: 14, + id: 15, name: r'lastUpdate', type: IsarType.long, ), r'link': PropertySchema( - id: 15, + id: 16, name: r'link', type: IsarType.string, ), r'name': PropertySchema( - id: 16, + id: 17, name: r'name', type: IsarType.string, ), r'source': PropertySchema( - id: 17, + id: 18, name: r'source', type: IsarType.string, ), r'status': PropertySchema( - id: 18, + id: 19, name: r'status', type: IsarType.byte, enumMap: _MangastatusEnumValueMap, @@ -241,13 +247,14 @@ void _mangaSerialize( writer.writeString(offsets[9], object.imageUrl); writer.writeBool(offsets[10], object.isLocalArchive); writer.writeBool(offsets[11], object.isManga); - 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); + 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); } Manga _mangaDeserialize( @@ -270,13 +277,15 @@ Manga _mangaDeserialize( imageUrl: reader.readStringOrNull(offsets[9]), isLocalArchive: reader.readBoolOrNull(offsets[10]), isManga: reader.readBoolOrNull(offsets[11]), - 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])] ?? + itemType: _MangaitemTypeValueEnumMap[reader.readByteOrNull(offsets[12])] ?? + 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])] ?? Status.ongoing, ); return object; @@ -314,18 +323,21 @@ P _mangaDeserializeProp

( case 11: return (reader.readBoolOrNull(offset)) as P; case 12: - return (reader.readStringOrNull(offset)) as P; + return (_MangaitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? + ItemType.manga) as P; case 13: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 14: return (reader.readLongOrNull(offset)) as P; case 15: - return (reader.readStringOrNull(offset)) as P; + return (reader.readLongOrNull(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: @@ -333,6 +345,16 @@ P _mangaDeserializeProp

( } } +const _MangaitemTypeEnumValueMap = { + 'manga': 0, + 'anime': 1, + 'novel': 2, +}; +const _MangaitemTypeValueEnumMap = { + 0: ItemType.manga, + 1: ItemType.anime, + 2: ItemType.novel, +}; const _MangastatusEnumValueMap = { 'ongoing': 0, 'completed': 1, @@ -1937,6 +1959,59 @@ extension MangaQueryFilter on QueryBuilder { }); } + QueryBuilder itemTypeEqualTo( + ItemType value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + 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 langIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -2875,6 +2950,18 @@ extension MangaQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.asc); + }); + } + + QueryBuilder sortByItemTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.desc); + }); + } + QueryBuilder sortByLang() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lang', Sort.asc); @@ -3081,6 +3168,18 @@ extension MangaQuerySortThenBy on QueryBuilder { }); } + QueryBuilder thenByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.asc); + }); + } + + QueryBuilder thenByItemTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.desc); + }); + } + QueryBuilder thenByLang() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lang', Sort.asc); @@ -3245,6 +3344,12 @@ extension MangaQueryWhereDistinct on QueryBuilder { }); } + QueryBuilder distinctByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'itemType'); + }); + } + QueryBuilder distinctByLang( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -3372,6 +3477,12 @@ extension MangaQueryProperty on QueryBuilder { }); } + QueryBuilder itemTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'itemType'); + }); + } + QueryBuilder langProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'lang'); diff --git a/lib/models/settings.dart b/lib/models/settings.dart index 5db084e9..ba0bc15e 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -185,11 +185,38 @@ class Settings { int? animeGridSize; + int? novelGridSize; + @enumerated late SectionType disableSectionType; bool? useLibass; + int? libraryFilterNovelDownloadType; + + int? libraryFilterNovelUnreadType; + + int? libraryFilterNovelStartedType; + + int? libraryFilterNovelBookMarkedType; + + bool? novelLibraryShowCategoryTabs; + + bool? novelLibraryDownloadedChapters; + + bool? novelLibraryShowLanguage; + + bool? novelLibraryShowNumbersOfItems; + + bool? novelLibraryShowContinueReadingButton; + + bool? novelLibraryLocalSource; + + late SortLibraryManga? sortLibraryNovel; + + @enumerated + late DisplayType novelDisplayType; + Settings( {this.id = 227, this.displayType = DisplayType.compactGrid, @@ -239,7 +266,7 @@ class Settings { this.animeLibraryShowNumbersOfItems = false, this.animeLibraryShowContinueReadingButton = false, this.animeLibraryLocalSource, - this.sortLibraryAnime, + this.sortLibraryAnime, // TODO add novel settings this.pagePreloadAmount = 6, this.scaleType = ScaleType.fitScreen, this.checkForExtensionUpdates = true, diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index 9f925e26..fe10556f 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -312,162 +312,229 @@ const SettingsSchema = CollectionSchema( name: r'libraryFilterMangasUnreadType', type: IsarType.long, ), - r'libraryLocalSource': PropertySchema( + r'libraryFilterNovelBookMarkedType': PropertySchema( id: 56, + name: r'libraryFilterNovelBookMarkedType', + type: IsarType.long, + ), + r'libraryFilterNovelDownloadType': PropertySchema( + id: 57, + name: r'libraryFilterNovelDownloadType', + type: IsarType.long, + ), + r'libraryFilterNovelStartedType': PropertySchema( + id: 58, + name: r'libraryFilterNovelStartedType', + type: IsarType.long, + ), + r'libraryFilterNovelUnreadType': PropertySchema( + id: 59, + name: r'libraryFilterNovelUnreadType', + type: IsarType.long, + ), + r'libraryLocalSource': PropertySchema( + id: 60, name: r'libraryLocalSource', type: IsarType.bool, ), r'libraryShowCategoryTabs': PropertySchema( - id: 57, + id: 61, name: r'libraryShowCategoryTabs', type: IsarType.bool, ), r'libraryShowContinueReadingButton': PropertySchema( - id: 58, + id: 62, name: r'libraryShowContinueReadingButton', type: IsarType.bool, ), r'libraryShowLanguage': PropertySchema( - id: 59, + id: 63, name: r'libraryShowLanguage', type: IsarType.bool, ), r'libraryShowNumbersOfItems': PropertySchema( - id: 60, + id: 64, name: r'libraryShowNumbersOfItems', type: IsarType.bool, ), r'locale': PropertySchema( - id: 61, + id: 65, name: r'locale', type: IsarType.object, target: r'L10nLocale', ), r'mangaGridSize': PropertySchema( - id: 62, + id: 66, name: r'mangaGridSize', type: IsarType.long, ), r'mangaHomeDisplayType': PropertySchema( - id: 63, + id: 67, name: r'mangaHomeDisplayType', type: IsarType.byte, enumMap: _SettingsmangaHomeDisplayTypeEnumValueMap, ), r'markEpisodeAsSeenType': PropertySchema( - id: 64, + id: 68, name: r'markEpisodeAsSeenType', type: IsarType.long, ), + r'novelDisplayType': PropertySchema( + id: 69, + name: r'novelDisplayType', + type: IsarType.byte, + enumMap: _SettingsnovelDisplayTypeEnumValueMap, + ), + r'novelGridSize': PropertySchema( + id: 70, + name: r'novelGridSize', + type: IsarType.long, + ), + r'novelLibraryDownloadedChapters': PropertySchema( + id: 71, + name: r'novelLibraryDownloadedChapters', + type: IsarType.bool, + ), + r'novelLibraryLocalSource': PropertySchema( + id: 72, + name: r'novelLibraryLocalSource', + type: IsarType.bool, + ), + r'novelLibraryShowCategoryTabs': PropertySchema( + id: 73, + name: r'novelLibraryShowCategoryTabs', + type: IsarType.bool, + ), + r'novelLibraryShowContinueReadingButton': PropertySchema( + id: 74, + name: r'novelLibraryShowContinueReadingButton', + type: IsarType.bool, + ), + r'novelLibraryShowLanguage': PropertySchema( + id: 75, + name: r'novelLibraryShowLanguage', + type: IsarType.bool, + ), + r'novelLibraryShowNumbersOfItems': PropertySchema( + id: 76, + name: r'novelLibraryShowNumbersOfItems', + type: IsarType.bool, + ), r'onlyIncludePinnedSources': PropertySchema( - id: 65, + id: 77, name: r'onlyIncludePinnedSources', type: IsarType.bool, ), r'pagePreloadAmount': PropertySchema( - id: 66, + id: 78, name: r'pagePreloadAmount', type: IsarType.long, ), r'personalPageModeList': PropertySchema( - id: 67, + id: 79, name: r'personalPageModeList', type: IsarType.objectList, target: r'PersonalPageMode', ), r'personalReaderModeList': PropertySchema( - id: 68, + id: 80, name: r'personalReaderModeList', type: IsarType.objectList, target: r'PersonalReaderMode', ), r'playerSubtitleSettings': PropertySchema( - id: 69, + id: 81, name: r'playerSubtitleSettings', type: IsarType.object, target: r'PlayerSubtitleSettings', ), r'pureBlackDarkMode': PropertySchema( - id: 70, + id: 82, name: r'pureBlackDarkMode', type: IsarType.bool, ), r'relativeTimesTamps': PropertySchema( - id: 71, + id: 83, name: r'relativeTimesTamps', type: IsarType.long, ), r'saveAsCBZArchive': PropertySchema( - id: 72, + id: 84, name: r'saveAsCBZArchive', type: IsarType.bool, ), r'scaleType': PropertySchema( - id: 73, + id: 85, name: r'scaleType', type: IsarType.byte, enumMap: _SettingsscaleTypeEnumValueMap, ), r'showPagesNumber': PropertySchema( - id: 74, + id: 86, name: r'showPagesNumber', type: IsarType.bool, ), r'sortChapterList': PropertySchema( - id: 75, + id: 87, name: r'sortChapterList', type: IsarType.objectList, target: r'SortChapter', ), r'sortLibraryAnime': PropertySchema( - id: 76, + id: 88, name: r'sortLibraryAnime', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryManga': PropertySchema( - id: 77, + id: 89, name: r'sortLibraryManga', type: IsarType.object, target: r'SortLibraryManga', ), + r'sortLibraryNovel': PropertySchema( + id: 90, + name: r'sortLibraryNovel', + type: IsarType.object, + target: r'SortLibraryManga', + ), r'startDatebackup': PropertySchema( - id: 78, + id: 91, name: r'startDatebackup', type: IsarType.long, ), r'syncAfterReading': PropertySchema( - id: 79, + id: 92, name: r'syncAfterReading', type: IsarType.bool, ), r'syncOnAppLaunch': PropertySchema( - id: 80, + id: 93, name: r'syncOnAppLaunch', type: IsarType.bool, ), r'themeIsDark': PropertySchema( - id: 81, + id: 94, name: r'themeIsDark', type: IsarType.bool, ), r'updateProgressAfterReading': PropertySchema( - id: 82, + id: 95, name: r'updateProgressAfterReading', type: IsarType.bool, ), r'useLibass': PropertySchema( - id: 83, + id: 96, name: r'useLibass', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( - id: 84, + id: 97, name: r'usePageTapZones', type: IsarType.bool, ), r'userAgent': PropertySchema( - id: 85, + id: 98, name: r'userAgent', type: IsarType.string, ) @@ -744,6 +811,14 @@ int _settingsEstimateSize( value, allOffsets[SortLibraryManga]!, allOffsets); } } + { + final value = object.sortLibraryNovel; + if (value != null) { + bytesCount += 3 + + SortLibraryMangaSchema.estimateSize( + value, allOffsets[SortLibraryManga]!, allOffsets); + } + } { final value = object.userAgent; if (value != null) { @@ -860,71 +935,89 @@ void _settingsSerialize( writer.writeLong(offsets[53], object.libraryFilterMangasDownloadType); writer.writeLong(offsets[54], object.libraryFilterMangasStartedType); writer.writeLong(offsets[55], object.libraryFilterMangasUnreadType); - writer.writeBool(offsets[56], object.libraryLocalSource); - writer.writeBool(offsets[57], object.libraryShowCategoryTabs); - writer.writeBool(offsets[58], object.libraryShowContinueReadingButton); - writer.writeBool(offsets[59], object.libraryShowLanguage); - writer.writeBool(offsets[60], object.libraryShowNumbersOfItems); + writer.writeLong(offsets[56], object.libraryFilterNovelBookMarkedType); + writer.writeLong(offsets[57], object.libraryFilterNovelDownloadType); + writer.writeLong(offsets[58], object.libraryFilterNovelStartedType); + writer.writeLong(offsets[59], object.libraryFilterNovelUnreadType); + writer.writeBool(offsets[60], object.libraryLocalSource); + writer.writeBool(offsets[61], object.libraryShowCategoryTabs); + writer.writeBool(offsets[62], object.libraryShowContinueReadingButton); + writer.writeBool(offsets[63], object.libraryShowLanguage); + writer.writeBool(offsets[64], object.libraryShowNumbersOfItems); writer.writeObject( - offsets[61], + offsets[65], allOffsets, L10nLocaleSchema.serialize, object.locale, ); - writer.writeLong(offsets[62], object.mangaGridSize); - writer.writeByte(offsets[63], object.mangaHomeDisplayType.index); - writer.writeLong(offsets[64], object.markEpisodeAsSeenType); - writer.writeBool(offsets[65], object.onlyIncludePinnedSources); - writer.writeLong(offsets[66], object.pagePreloadAmount); + writer.writeLong(offsets[66], object.mangaGridSize); + writer.writeByte(offsets[67], object.mangaHomeDisplayType.index); + writer.writeLong(offsets[68], object.markEpisodeAsSeenType); + writer.writeByte(offsets[69], object.novelDisplayType.index); + writer.writeLong(offsets[70], object.novelGridSize); + writer.writeBool(offsets[71], object.novelLibraryDownloadedChapters); + writer.writeBool(offsets[72], object.novelLibraryLocalSource); + writer.writeBool(offsets[73], object.novelLibraryShowCategoryTabs); + writer.writeBool(offsets[74], object.novelLibraryShowContinueReadingButton); + writer.writeBool(offsets[75], object.novelLibraryShowLanguage); + writer.writeBool(offsets[76], object.novelLibraryShowNumbersOfItems); + writer.writeBool(offsets[77], object.onlyIncludePinnedSources); + writer.writeLong(offsets[78], object.pagePreloadAmount); writer.writeObjectList( - offsets[67], + offsets[79], allOffsets, PersonalPageModeSchema.serialize, object.personalPageModeList, ); writer.writeObjectList( - offsets[68], + offsets[80], allOffsets, PersonalReaderModeSchema.serialize, object.personalReaderModeList, ); writer.writeObject( - offsets[69], + offsets[81], allOffsets, PlayerSubtitleSettingsSchema.serialize, object.playerSubtitleSettings, ); - writer.writeBool(offsets[70], object.pureBlackDarkMode); - writer.writeLong(offsets[71], object.relativeTimesTamps); - writer.writeBool(offsets[72], object.saveAsCBZArchive); - writer.writeByte(offsets[73], object.scaleType.index); - writer.writeBool(offsets[74], object.showPagesNumber); + writer.writeBool(offsets[82], object.pureBlackDarkMode); + writer.writeLong(offsets[83], object.relativeTimesTamps); + writer.writeBool(offsets[84], object.saveAsCBZArchive); + writer.writeByte(offsets[85], object.scaleType.index); + writer.writeBool(offsets[86], object.showPagesNumber); writer.writeObjectList( - offsets[75], + offsets[87], allOffsets, SortChapterSchema.serialize, object.sortChapterList, ); writer.writeObject( - offsets[76], + offsets[88], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryAnime, ); writer.writeObject( - offsets[77], + offsets[89], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryManga, ); - writer.writeLong(offsets[78], object.startDatebackup); - writer.writeBool(offsets[79], object.syncAfterReading); - writer.writeBool(offsets[80], object.syncOnAppLaunch); - writer.writeBool(offsets[81], object.themeIsDark); - writer.writeBool(offsets[82], object.updateProgressAfterReading); - writer.writeBool(offsets[83], object.useLibass); - writer.writeBool(offsets[84], object.usePageTapZones); - writer.writeString(offsets[85], object.userAgent); + writer.writeObject( + offsets[90], + allOffsets, + SortLibraryMangaSchema.serialize, + object.sortLibraryNovel, + ); + writer.writeLong(offsets[91], object.startDatebackup); + writer.writeBool(offsets[92], object.syncAfterReading); + writer.writeBool(offsets[93], object.syncOnAppLaunch); + writer.writeBool(offsets[94], object.themeIsDark); + writer.writeBool(offsets[95], object.updateProgressAfterReading); + writer.writeBool(offsets[96], object.useLibass); + writer.writeBool(offsets[97], object.usePageTapZones); + writer.writeString(offsets[98], object.userAgent); } Settings _settingsDeserialize( @@ -1029,66 +1122,66 @@ Settings _settingsDeserialize( libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[53]), libraryFilterMangasStartedType: reader.readLongOrNull(offsets[54]), libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[55]), - libraryLocalSource: reader.readBoolOrNull(offsets[56]), - libraryShowCategoryTabs: reader.readBoolOrNull(offsets[57]), - libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[58]), - libraryShowLanguage: reader.readBoolOrNull(offsets[59]), - libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[60]), - mangaGridSize: reader.readLongOrNull(offsets[62]), + libraryLocalSource: reader.readBoolOrNull(offsets[60]), + libraryShowCategoryTabs: reader.readBoolOrNull(offsets[61]), + libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[62]), + libraryShowLanguage: reader.readBoolOrNull(offsets[63]), + libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[64]), + mangaGridSize: reader.readLongOrNull(offsets[66]), mangaHomeDisplayType: _SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[63])] ?? + reader.readByteOrNull(offsets[67])] ?? DisplayType.comfortableGrid, - markEpisodeAsSeenType: reader.readLongOrNull(offsets[64]), - onlyIncludePinnedSources: reader.readBoolOrNull(offsets[65]), - pagePreloadAmount: reader.readLongOrNull(offsets[66]), + markEpisodeAsSeenType: reader.readLongOrNull(offsets[68]), + onlyIncludePinnedSources: reader.readBoolOrNull(offsets[77]), + pagePreloadAmount: reader.readLongOrNull(offsets[78]), personalPageModeList: reader.readObjectList( - offsets[67], + offsets[79], PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), ), personalReaderModeList: reader.readObjectList( - offsets[68], + offsets[80], PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), ), playerSubtitleSettings: reader.readObjectOrNull( - offsets[69], + offsets[81], PlayerSubtitleSettingsSchema.deserialize, allOffsets, ), - pureBlackDarkMode: reader.readBoolOrNull(offsets[70]), - relativeTimesTamps: reader.readLongOrNull(offsets[71]), - saveAsCBZArchive: reader.readBoolOrNull(offsets[72]), + pureBlackDarkMode: reader.readBoolOrNull(offsets[82]), + relativeTimesTamps: reader.readLongOrNull(offsets[83]), + saveAsCBZArchive: reader.readBoolOrNull(offsets[84]), scaleType: - _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[73])] ?? + _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[85])] ?? ScaleType.fitScreen, - showPagesNumber: reader.readBoolOrNull(offsets[74]), + showPagesNumber: reader.readBoolOrNull(offsets[86]), sortChapterList: reader.readObjectList( - offsets[75], + offsets[87], SortChapterSchema.deserialize, allOffsets, SortChapter(), ), sortLibraryAnime: reader.readObjectOrNull( - offsets[76], + offsets[88], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryManga: reader.readObjectOrNull( - offsets[77], + offsets[89], SortLibraryMangaSchema.deserialize, allOffsets, ), - startDatebackup: reader.readLongOrNull(offsets[78]), - syncAfterReading: reader.readBoolOrNull(offsets[79]), - syncOnAppLaunch: reader.readBoolOrNull(offsets[80]), - themeIsDark: reader.readBoolOrNull(offsets[81]), - updateProgressAfterReading: reader.readBoolOrNull(offsets[82]), - useLibass: reader.readBoolOrNull(offsets[83]), - usePageTapZones: reader.readBoolOrNull(offsets[84]), - userAgent: reader.readStringOrNull(offsets[85]), + startDatebackup: reader.readLongOrNull(offsets[91]), + syncAfterReading: reader.readBoolOrNull(offsets[92]), + syncOnAppLaunch: reader.readBoolOrNull(offsets[93]), + themeIsDark: reader.readBoolOrNull(offsets[94]), + updateProgressAfterReading: reader.readBoolOrNull(offsets[95]), + useLibass: reader.readBoolOrNull(offsets[96]), + usePageTapZones: reader.readBoolOrNull(offsets[97]), + userAgent: reader.readStringOrNull(offsets[98]), ); object.chapterFilterBookmarkedList = reader.readObjectList( @@ -1109,11 +1202,31 @@ Settings _settingsDeserialize( allOffsets, FilterScanlator(), ); + object.libraryFilterNovelBookMarkedType = reader.readLongOrNull(offsets[56]); + object.libraryFilterNovelDownloadType = reader.readLongOrNull(offsets[57]); + object.libraryFilterNovelStartedType = reader.readLongOrNull(offsets[58]); + object.libraryFilterNovelUnreadType = reader.readLongOrNull(offsets[59]); object.locale = reader.readObjectOrNull( - offsets[61], + offsets[65], L10nLocaleSchema.deserialize, allOffsets, ); + object.novelDisplayType = _SettingsnovelDisplayTypeValueEnumMap[ + reader.readByteOrNull(offsets[69])] ?? + DisplayType.compactGrid; + object.novelGridSize = reader.readLongOrNull(offsets[70]); + object.novelLibraryDownloadedChapters = reader.readBoolOrNull(offsets[71]); + object.novelLibraryLocalSource = reader.readBoolOrNull(offsets[72]); + object.novelLibraryShowCategoryTabs = reader.readBoolOrNull(offsets[73]); + object.novelLibraryShowContinueReadingButton = + reader.readBoolOrNull(offsets[74]); + object.novelLibraryShowLanguage = reader.readBoolOrNull(offsets[75]); + object.novelLibraryShowNumbersOfItems = reader.readBoolOrNull(offsets[76]); + object.sortLibraryNovel = reader.readObjectOrNull( + offsets[90], + SortLibraryMangaSchema.deserialize, + allOffsets, + ); return object; } @@ -1292,98 +1405,130 @@ P _settingsDeserializeProp

( case 55: return (reader.readLongOrNull(offset)) as P; case 56: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 57: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 58: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 59: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 60: return (reader.readBoolOrNull(offset)) as P; case 61: + return (reader.readBoolOrNull(offset)) as P; + case 62: + return (reader.readBoolOrNull(offset)) as P; + case 63: + return (reader.readBoolOrNull(offset)) as P; + case 64: + return (reader.readBoolOrNull(offset)) as P; + case 65: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 62: - return (reader.readLongOrNull(offset)) as P; - case 63: - return (_SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offset)] ?? - DisplayType.comfortableGrid) as P; - case 64: - return (reader.readLongOrNull(offset)) as P; - case 65: - return (reader.readBoolOrNull(offset)) as P; case 66: return (reader.readLongOrNull(offset)) as P; case 67: + return (_SettingsmangaHomeDisplayTypeValueEnumMap[ + reader.readByteOrNull(offset)] ?? + DisplayType.comfortableGrid) as P; + case 68: + return (reader.readLongOrNull(offset)) as P; + case 69: + return (_SettingsnovelDisplayTypeValueEnumMap[ + reader.readByteOrNull(offset)] ?? + DisplayType.compactGrid) as P; + case 70: + return (reader.readLongOrNull(offset)) as P; + case 71: + return (reader.readBoolOrNull(offset)) as P; + case 72: + return (reader.readBoolOrNull(offset)) as P; + case 73: + return (reader.readBoolOrNull(offset)) as P; + case 74: + return (reader.readBoolOrNull(offset)) as P; + case 75: + return (reader.readBoolOrNull(offset)) as P; + case 76: + return (reader.readBoolOrNull(offset)) as P; + case 77: + return (reader.readBoolOrNull(offset)) as P; + case 78: + return (reader.readLongOrNull(offset)) as P; + case 79: return (reader.readObjectList( offset, PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), )) as P; - case 68: + case 80: return (reader.readObjectList( offset, PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), )) as P; - case 69: + case 81: return (reader.readObjectOrNull( offset, PlayerSubtitleSettingsSchema.deserialize, allOffsets, )) as P; - case 70: + case 82: return (reader.readBoolOrNull(offset)) as P; - case 71: + case 83: return (reader.readLongOrNull(offset)) as P; - case 72: + case 84: return (reader.readBoolOrNull(offset)) as P; - case 73: + case 85: return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? ScaleType.fitScreen) as P; - case 74: + case 86: return (reader.readBoolOrNull(offset)) as P; - case 75: + case 87: return (reader.readObjectList( offset, SortChapterSchema.deserialize, allOffsets, SortChapter(), )) as P; - case 76: + case 88: return (reader.readObjectOrNull( offset, SortLibraryMangaSchema.deserialize, allOffsets, )) as P; - case 77: + case 89: return (reader.readObjectOrNull( offset, SortLibraryMangaSchema.deserialize, allOffsets, )) as P; - case 78: + case 90: + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; + case 91: return (reader.readLongOrNull(offset)) as P; - case 79: + case 92: return (reader.readBoolOrNull(offset)) as P; - case 80: + case 93: return (reader.readBoolOrNull(offset)) as P; - case 81: + case 94: return (reader.readBoolOrNull(offset)) as P; - case 82: + case 95: return (reader.readBoolOrNull(offset)) as P; - case 83: + case 96: return (reader.readBoolOrNull(offset)) as P; - case 84: + case 97: return (reader.readBoolOrNull(offset)) as P; - case 85: + case 98: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -1494,6 +1639,18 @@ const _SettingsmangaHomeDisplayTypeValueEnumMap = { 2: DisplayType.coverOnlyGrid, 3: DisplayType.list, }; +const _SettingsnovelDisplayTypeEnumValueMap = { + 'compactGrid': 0, + 'comfortableGrid': 1, + 'coverOnlyGrid': 2, + 'list': 3, +}; +const _SettingsnovelDisplayTypeValueEnumMap = { + 0: DisplayType.compactGrid, + 1: DisplayType.comfortableGrid, + 2: DisplayType.coverOnlyGrid, + 3: DisplayType.list, +}; const _SettingsscaleTypeEnumValueMap = { 'fitScreen': 0, 'stretch': 1, @@ -5622,6 +5779,302 @@ extension SettingsQueryFilter }); } + QueryBuilder + libraryFilterNovelBookMarkedTypeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'libraryFilterNovelBookMarkedType', + )); + }); + } + + QueryBuilder + libraryFilterNovelBookMarkedTypeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'libraryFilterNovelBookMarkedType', + )); + }); + } + + QueryBuilder + libraryFilterNovelBookMarkedTypeEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'libraryFilterNovelBookMarkedType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelBookMarkedTypeGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'libraryFilterNovelBookMarkedType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelBookMarkedTypeLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'libraryFilterNovelBookMarkedType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelBookMarkedTypeBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'libraryFilterNovelBookMarkedType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + libraryFilterNovelDownloadTypeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'libraryFilterNovelDownloadType', + )); + }); + } + + QueryBuilder + libraryFilterNovelDownloadTypeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'libraryFilterNovelDownloadType', + )); + }); + } + + QueryBuilder + libraryFilterNovelDownloadTypeEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'libraryFilterNovelDownloadType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelDownloadTypeGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'libraryFilterNovelDownloadType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelDownloadTypeLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'libraryFilterNovelDownloadType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelDownloadTypeBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'libraryFilterNovelDownloadType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + libraryFilterNovelStartedTypeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'libraryFilterNovelStartedType', + )); + }); + } + + QueryBuilder + libraryFilterNovelStartedTypeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'libraryFilterNovelStartedType', + )); + }); + } + + QueryBuilder + libraryFilterNovelStartedTypeEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'libraryFilterNovelStartedType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelStartedTypeGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'libraryFilterNovelStartedType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelStartedTypeLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'libraryFilterNovelStartedType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelStartedTypeBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'libraryFilterNovelStartedType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + libraryFilterNovelUnreadTypeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'libraryFilterNovelUnreadType', + )); + }); + } + + QueryBuilder + libraryFilterNovelUnreadTypeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'libraryFilterNovelUnreadType', + )); + }); + } + + QueryBuilder + libraryFilterNovelUnreadTypeEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'libraryFilterNovelUnreadType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelUnreadTypeGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'libraryFilterNovelUnreadType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelUnreadTypeLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'libraryFilterNovelUnreadType', + value: value, + )); + }); + } + + QueryBuilder + libraryFilterNovelUnreadTypeBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'libraryFilterNovelUnreadType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder libraryLocalSourceIsNull() { return QueryBuilder.apply(this, (query) { @@ -5980,6 +6433,302 @@ extension SettingsQueryFilter }); } + QueryBuilder + novelDisplayTypeEqualTo(DisplayType value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelDisplayType', + value: value, + )); + }); + } + + QueryBuilder + novelDisplayTypeGreaterThan( + DisplayType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'novelDisplayType', + value: value, + )); + }); + } + + QueryBuilder + novelDisplayTypeLessThan( + DisplayType value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'novelDisplayType', + value: value, + )); + }); + } + + QueryBuilder + novelDisplayTypeBetween( + DisplayType lower, + DisplayType upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'novelDisplayType', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + novelGridSizeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelGridSize', + )); + }); + } + + QueryBuilder + novelGridSizeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelGridSize', + )); + }); + } + + QueryBuilder novelGridSizeEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelGridSize', + value: value, + )); + }); + } + + QueryBuilder + novelGridSizeGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'novelGridSize', + value: value, + )); + }); + } + + QueryBuilder novelGridSizeLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'novelGridSize', + value: value, + )); + }); + } + + QueryBuilder novelGridSizeBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'novelGridSize', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + + QueryBuilder + novelLibraryDownloadedChaptersIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelLibraryDownloadedChapters', + )); + }); + } + + QueryBuilder + novelLibraryDownloadedChaptersIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelLibraryDownloadedChapters', + )); + }); + } + + QueryBuilder + novelLibraryDownloadedChaptersEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelLibraryDownloadedChapters', + value: value, + )); + }); + } + + QueryBuilder + novelLibraryLocalSourceIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelLibraryLocalSource', + )); + }); + } + + QueryBuilder + novelLibraryLocalSourceIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelLibraryLocalSource', + )); + }); + } + + QueryBuilder + novelLibraryLocalSourceEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelLibraryLocalSource', + value: value, + )); + }); + } + + QueryBuilder + novelLibraryShowCategoryTabsIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelLibraryShowCategoryTabs', + )); + }); + } + + QueryBuilder + novelLibraryShowCategoryTabsIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelLibraryShowCategoryTabs', + )); + }); + } + + QueryBuilder + novelLibraryShowCategoryTabsEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelLibraryShowCategoryTabs', + value: value, + )); + }); + } + + QueryBuilder + novelLibraryShowContinueReadingButtonIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelLibraryShowContinueReadingButton', + )); + }); + } + + QueryBuilder + novelLibraryShowContinueReadingButtonIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelLibraryShowContinueReadingButton', + )); + }); + } + + QueryBuilder + novelLibraryShowContinueReadingButtonEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelLibraryShowContinueReadingButton', + value: value, + )); + }); + } + + QueryBuilder + novelLibraryShowLanguageIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelLibraryShowLanguage', + )); + }); + } + + QueryBuilder + novelLibraryShowLanguageIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelLibraryShowLanguage', + )); + }); + } + + QueryBuilder + novelLibraryShowLanguageEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelLibraryShowLanguage', + value: value, + )); + }); + } + + QueryBuilder + novelLibraryShowNumbersOfItemsIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelLibraryShowNumbersOfItems', + )); + }); + } + + QueryBuilder + novelLibraryShowNumbersOfItemsIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelLibraryShowNumbersOfItems', + )); + }); + } + + QueryBuilder + novelLibraryShowNumbersOfItemsEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelLibraryShowNumbersOfItems', + value: value, + )); + }); + } + QueryBuilder onlyIncludePinnedSourcesIsNull() { return QueryBuilder.apply(this, (query) { @@ -6668,6 +7417,24 @@ extension SettingsQueryFilter }); } + QueryBuilder + sortLibraryNovelIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'sortLibraryNovel', + )); + }); + } + + QueryBuilder + sortLibraryNovelIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'sortLibraryNovel', + )); + }); + } + QueryBuilder startDatebackupIsNull() { return QueryBuilder.apply(this, (query) { @@ -7170,6 +7937,13 @@ extension SettingsQueryObject return query.object(q, r'sortLibraryManga'); }); } + + QueryBuilder sortLibraryNovel( + FilterQuery q) { + return QueryBuilder.apply(this, (query) { + return query.object(q, r'sortLibraryNovel'); + }); + } } extension SettingsQueryLinks @@ -7839,6 +8613,62 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder + sortByLibraryFilterNovelBookMarkedType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelBookMarkedType', Sort.asc); + }); + } + + QueryBuilder + sortByLibraryFilterNovelBookMarkedTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelBookMarkedType', Sort.desc); + }); + } + + QueryBuilder + sortByLibraryFilterNovelDownloadType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelDownloadType', Sort.asc); + }); + } + + QueryBuilder + sortByLibraryFilterNovelDownloadTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelDownloadType', Sort.desc); + }); + } + + QueryBuilder + sortByLibraryFilterNovelStartedType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelStartedType', Sort.asc); + }); + } + + QueryBuilder + sortByLibraryFilterNovelStartedTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelStartedType', Sort.desc); + }); + } + + QueryBuilder + sortByLibraryFilterNovelUnreadType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelUnreadType', Sort.asc); + }); + } + + QueryBuilder + sortByLibraryFilterNovelUnreadTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelUnreadType', Sort.desc); + }); + } + QueryBuilder sortByLibraryLocalSource() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryLocalSource', Sort.asc); @@ -7945,6 +8775,116 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByNovelDisplayType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelDisplayType', Sort.asc); + }); + } + + QueryBuilder sortByNovelDisplayTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelDisplayType', Sort.desc); + }); + } + + QueryBuilder sortByNovelGridSize() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelGridSize', Sort.asc); + }); + } + + QueryBuilder sortByNovelGridSizeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelGridSize', Sort.desc); + }); + } + + QueryBuilder + sortByNovelLibraryDownloadedChapters() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryDownloadedChapters', Sort.asc); + }); + } + + QueryBuilder + sortByNovelLibraryDownloadedChaptersDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryDownloadedChapters', Sort.desc); + }); + } + + QueryBuilder + sortByNovelLibraryLocalSource() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryLocalSource', Sort.asc); + }); + } + + QueryBuilder + sortByNovelLibraryLocalSourceDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryLocalSource', Sort.desc); + }); + } + + QueryBuilder + sortByNovelLibraryShowCategoryTabs() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowCategoryTabs', Sort.asc); + }); + } + + QueryBuilder + sortByNovelLibraryShowCategoryTabsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowCategoryTabs', Sort.desc); + }); + } + + QueryBuilder + sortByNovelLibraryShowContinueReadingButton() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + r'novelLibraryShowContinueReadingButton', Sort.asc); + }); + } + + QueryBuilder + sortByNovelLibraryShowContinueReadingButtonDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + r'novelLibraryShowContinueReadingButton', Sort.desc); + }); + } + + QueryBuilder + sortByNovelLibraryShowLanguage() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowLanguage', Sort.asc); + }); + } + + QueryBuilder + sortByNovelLibraryShowLanguageDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowLanguage', Sort.desc); + }); + } + + QueryBuilder + sortByNovelLibraryShowNumbersOfItems() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowNumbersOfItems', Sort.asc); + }); + } + + QueryBuilder + sortByNovelLibraryShowNumbersOfItemsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowNumbersOfItems', Sort.desc); + }); + } + QueryBuilder sortByOnlyIncludePinnedSources() { return QueryBuilder.apply(this, (query) { @@ -8751,6 +9691,62 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder + thenByLibraryFilterNovelBookMarkedType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelBookMarkedType', Sort.asc); + }); + } + + QueryBuilder + thenByLibraryFilterNovelBookMarkedTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelBookMarkedType', Sort.desc); + }); + } + + QueryBuilder + thenByLibraryFilterNovelDownloadType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelDownloadType', Sort.asc); + }); + } + + QueryBuilder + thenByLibraryFilterNovelDownloadTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelDownloadType', Sort.desc); + }); + } + + QueryBuilder + thenByLibraryFilterNovelStartedType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelStartedType', Sort.asc); + }); + } + + QueryBuilder + thenByLibraryFilterNovelStartedTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelStartedType', Sort.desc); + }); + } + + QueryBuilder + thenByLibraryFilterNovelUnreadType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelUnreadType', Sort.asc); + }); + } + + QueryBuilder + thenByLibraryFilterNovelUnreadTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'libraryFilterNovelUnreadType', Sort.desc); + }); + } + QueryBuilder thenByLibraryLocalSource() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'libraryLocalSource', Sort.asc); @@ -8857,6 +9853,116 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByNovelDisplayType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelDisplayType', Sort.asc); + }); + } + + QueryBuilder thenByNovelDisplayTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelDisplayType', Sort.desc); + }); + } + + QueryBuilder thenByNovelGridSize() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelGridSize', Sort.asc); + }); + } + + QueryBuilder thenByNovelGridSizeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelGridSize', Sort.desc); + }); + } + + QueryBuilder + thenByNovelLibraryDownloadedChapters() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryDownloadedChapters', Sort.asc); + }); + } + + QueryBuilder + thenByNovelLibraryDownloadedChaptersDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryDownloadedChapters', Sort.desc); + }); + } + + QueryBuilder + thenByNovelLibraryLocalSource() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryLocalSource', Sort.asc); + }); + } + + QueryBuilder + thenByNovelLibraryLocalSourceDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryLocalSource', Sort.desc); + }); + } + + QueryBuilder + thenByNovelLibraryShowCategoryTabs() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowCategoryTabs', Sort.asc); + }); + } + + QueryBuilder + thenByNovelLibraryShowCategoryTabsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowCategoryTabs', Sort.desc); + }); + } + + QueryBuilder + thenByNovelLibraryShowContinueReadingButton() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + r'novelLibraryShowContinueReadingButton', Sort.asc); + }); + } + + QueryBuilder + thenByNovelLibraryShowContinueReadingButtonDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy( + r'novelLibraryShowContinueReadingButton', Sort.desc); + }); + } + + QueryBuilder + thenByNovelLibraryShowLanguage() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowLanguage', Sort.asc); + }); + } + + QueryBuilder + thenByNovelLibraryShowLanguageDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowLanguage', Sort.desc); + }); + } + + QueryBuilder + thenByNovelLibraryShowNumbersOfItems() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowNumbersOfItems', Sort.asc); + }); + } + + QueryBuilder + thenByNovelLibraryShowNumbersOfItemsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelLibraryShowNumbersOfItems', Sort.desc); + }); + } + QueryBuilder thenByOnlyIncludePinnedSources() { return QueryBuilder.apply(this, (query) { @@ -9360,6 +10466,34 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder + distinctByLibraryFilterNovelBookMarkedType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'libraryFilterNovelBookMarkedType'); + }); + } + + QueryBuilder + distinctByLibraryFilterNovelDownloadType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'libraryFilterNovelDownloadType'); + }); + } + + QueryBuilder + distinctByLibraryFilterNovelStartedType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'libraryFilterNovelStartedType'); + }); + } + + QueryBuilder + distinctByLibraryFilterNovelUnreadType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'libraryFilterNovelUnreadType'); + }); + } + QueryBuilder distinctByLibraryLocalSource() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'libraryLocalSource'); @@ -9412,6 +10546,60 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByNovelDisplayType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelDisplayType'); + }); + } + + QueryBuilder distinctByNovelGridSize() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelGridSize'); + }); + } + + QueryBuilder + distinctByNovelLibraryDownloadedChapters() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelLibraryDownloadedChapters'); + }); + } + + QueryBuilder + distinctByNovelLibraryLocalSource() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelLibraryLocalSource'); + }); + } + + QueryBuilder + distinctByNovelLibraryShowCategoryTabs() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelLibraryShowCategoryTabs'); + }); + } + + QueryBuilder + distinctByNovelLibraryShowContinueReadingButton() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelLibraryShowContinueReadingButton'); + }); + } + + QueryBuilder + distinctByNovelLibraryShowLanguage() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelLibraryShowLanguage'); + }); + } + + QueryBuilder + distinctByNovelLibraryShowNumbersOfItems() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelLibraryShowNumbersOfItems'); + }); + } + QueryBuilder distinctByOnlyIncludePinnedSources() { return QueryBuilder.apply(this, (query) { @@ -9892,6 +11080,34 @@ extension SettingsQueryProperty }); } + QueryBuilder + libraryFilterNovelBookMarkedTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'libraryFilterNovelBookMarkedType'); + }); + } + + QueryBuilder + libraryFilterNovelDownloadTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'libraryFilterNovelDownloadType'); + }); + } + + QueryBuilder + libraryFilterNovelStartedTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'libraryFilterNovelStartedType'); + }); + } + + QueryBuilder + libraryFilterNovelUnreadTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'libraryFilterNovelUnreadType'); + }); + } + QueryBuilder libraryLocalSourceProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'libraryLocalSource'); @@ -9952,6 +11168,61 @@ extension SettingsQueryProperty }); } + QueryBuilder + novelDisplayTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelDisplayType'); + }); + } + + QueryBuilder novelGridSizeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelGridSize'); + }); + } + + QueryBuilder + novelLibraryDownloadedChaptersProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelLibraryDownloadedChapters'); + }); + } + + QueryBuilder + novelLibraryLocalSourceProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelLibraryLocalSource'); + }); + } + + QueryBuilder + novelLibraryShowCategoryTabsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelLibraryShowCategoryTabs'); + }); + } + + QueryBuilder + novelLibraryShowContinueReadingButtonProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelLibraryShowContinueReadingButton'); + }); + } + + QueryBuilder + novelLibraryShowLanguageProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelLibraryShowLanguage'); + }); + } + + QueryBuilder + novelLibraryShowNumbersOfItemsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelLibraryShowNumbersOfItems'); + }); + } + QueryBuilder onlyIncludePinnedSourcesProperty() { return QueryBuilder.apply(this, (query) { @@ -10037,6 +11308,13 @@ extension SettingsQueryProperty }); } + QueryBuilder + sortLibraryNovelProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'sortLibraryNovel'); + }); + } + QueryBuilder startDatebackupProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'startDatebackup'); diff --git a/lib/models/source.dart b/lib/models/source.dart index 8f946255..48242516 100644 --- a/lib/models/source.dart +++ b/lib/models/source.dart @@ -1,5 +1,6 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/eval/dart/model/m_source.dart'; +import 'package:mangayomi/models/manga.dart'; part 'source.g.dart'; @collection @@ -49,6 +50,9 @@ class Source { bool? isManga; + @enumerated + late ItemType itemType; + String? appMinVerReq; String? additionalParams; @@ -83,6 +87,7 @@ class Source { this.sourceCode = '', this.headers = '', this.isManga = true, + this.itemType = ItemType.manga, this.appMinVerReq = "", this.additionalParams = "", this.isLocal = false, @@ -102,6 +107,7 @@ class Source { isAdded = json['isAdded']; isFullData = json['isFullData']; isManga = json['isManga']; + itemType = ItemType.values[json['itemType'] ?? 0]; isNsfw = json['isNsfw']; isPinned = json['isPinned']; lang = json['lang']; @@ -133,6 +139,7 @@ class Source { 'isAdded': isAdded, 'isFullData': isFullData, 'isManga': isManga, + 'itemType': itemType, 'isNsfw': isNsfw, 'isPinned': isPinned, 'lang': lang, diff --git a/lib/models/source.g.dart b/lib/models/source.g.dart index 0494e6b7..c18082c3 100644 --- a/lib/models/source.g.dart +++ b/lib/models/source.g.dart @@ -107,49 +107,55 @@ const SourceSchema = CollectionSchema( name: r'isTorrent', type: IsarType.bool, ), - r'lang': PropertySchema( + r'itemType': PropertySchema( id: 18, + name: r'itemType', + type: IsarType.byte, + enumMap: _SourceitemTypeEnumValueMap, + ), + r'lang': PropertySchema( + id: 19, name: r'lang', type: IsarType.string, ), r'lastUsed': PropertySchema( - id: 19, + id: 20, name: r'lastUsed', type: IsarType.bool, ), r'name': PropertySchema( - id: 20, + id: 21, name: r'name', type: IsarType.string, ), r'sourceCode': PropertySchema( - id: 21, + id: 22, name: r'sourceCode', type: IsarType.string, ), r'sourceCodeLanguage': PropertySchema( - id: 22, + id: 23, name: r'sourceCodeLanguage', type: IsarType.byte, enumMap: _SourcesourceCodeLanguageEnumValueMap, ), r'sourceCodeUrl': PropertySchema( - id: 23, + id: 24, name: r'sourceCodeUrl', type: IsarType.string, ), r'typeSource': PropertySchema( - id: 24, + id: 25, name: r'typeSource', type: IsarType.string, ), r'version': PropertySchema( - id: 25, + id: 26, name: r'version', type: IsarType.string, ), r'versionLast': PropertySchema( - id: 26, + id: 27, name: r'versionLast', type: IsarType.string, ) @@ -291,15 +297,16 @@ void _sourceSerialize( writer.writeBool(offsets[15], object.isObsolete); writer.writeBool(offsets[16], object.isPinned); writer.writeBool(offsets[17], object.isTorrent); - writer.writeString(offsets[18], object.lang); - writer.writeBool(offsets[19], object.lastUsed); - writer.writeString(offsets[20], object.name); - writer.writeString(offsets[21], object.sourceCode); - writer.writeByte(offsets[22], object.sourceCodeLanguage.index); - writer.writeString(offsets[23], object.sourceCodeUrl); - writer.writeString(offsets[24], object.typeSource); - writer.writeString(offsets[25], object.version); - writer.writeString(offsets[26], object.versionLast); + writer.writeByte(offsets[18], object.itemType.index); + writer.writeString(offsets[19], object.lang); + writer.writeBool(offsets[20], object.lastUsed); + writer.writeString(offsets[21], object.name); + writer.writeString(offsets[22], object.sourceCode); + writer.writeByte(offsets[23], object.sourceCodeLanguage.index); + writer.writeString(offsets[24], object.sourceCodeUrl); + writer.writeString(offsets[25], object.typeSource); + writer.writeString(offsets[26], object.version); + writer.writeString(offsets[27], object.versionLast); } Source _sourceDeserialize( @@ -327,17 +334,19 @@ Source _sourceDeserialize( isNsfw: reader.readBoolOrNull(offsets[14]), isObsolete: reader.readBoolOrNull(offsets[15]), isPinned: reader.readBoolOrNull(offsets[16]), - lang: reader.readStringOrNull(offsets[18]), - lastUsed: reader.readBoolOrNull(offsets[19]), - name: reader.readStringOrNull(offsets[20]), - sourceCode: reader.readStringOrNull(offsets[21]), - sourceCodeUrl: reader.readStringOrNull(offsets[23]), - typeSource: reader.readStringOrNull(offsets[24]), - version: reader.readStringOrNull(offsets[25]), - versionLast: reader.readStringOrNull(offsets[26]), + itemType: _SourceitemTypeValueEnumMap[reader.readByteOrNull(offsets[18])] ?? + ItemType.manga, + lang: reader.readStringOrNull(offsets[19]), + lastUsed: reader.readBoolOrNull(offsets[20]), + name: reader.readStringOrNull(offsets[21]), + sourceCode: reader.readStringOrNull(offsets[22]), + sourceCodeUrl: reader.readStringOrNull(offsets[24]), + typeSource: reader.readStringOrNull(offsets[25]), + version: reader.readStringOrNull(offsets[26]), + versionLast: reader.readStringOrNull(offsets[27]), ); object.sourceCodeLanguage = _SourcesourceCodeLanguageValueEnumMap[ - reader.readByteOrNull(offsets[22])] ?? + reader.readByteOrNull(offsets[23])] ?? SourceCodeLanguage.dart; return object; } @@ -386,30 +395,43 @@ P _sourceDeserializeProp

( case 17: return (reader.readBool(offset)) as P; case 18: - return (reader.readStringOrNull(offset)) as P; + return (_SourceitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? + ItemType.manga) as P; case 19: - return (reader.readBoolOrNull(offset)) as P; - case 20: return (reader.readStringOrNull(offset)) as P; + case 20: + return (reader.readBoolOrNull(offset)) as P; case 21: return (reader.readStringOrNull(offset)) as P; case 22: + return (reader.readStringOrNull(offset)) as P; + case 23: return (_SourcesourceCodeLanguageValueEnumMap[ reader.readByteOrNull(offset)] ?? SourceCodeLanguage.dart) as P; - case 23: - return (reader.readStringOrNull(offset)) as P; case 24: return (reader.readStringOrNull(offset)) as P; case 25: return (reader.readStringOrNull(offset)) as P; case 26: return (reader.readStringOrNull(offset)) as P; + case 27: + return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); } } +const _SourceitemTypeEnumValueMap = { + 'manga': 0, + 'anime': 1, + 'novel': 2, +}; +const _SourceitemTypeValueEnumMap = { + 0: ItemType.manga, + 1: ItemType.anime, + 2: ItemType.novel, +}; const _SourcesourceCodeLanguageEnumValueMap = { 'dart': 0, 'javascript': 1, @@ -1997,6 +2019,59 @@ extension SourceQueryFilter on QueryBuilder { }); } + QueryBuilder itemTypeEqualTo( + ItemType value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + 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 langIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -3321,6 +3396,18 @@ extension SourceQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.asc); + }); + } + + QueryBuilder sortByItemTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.desc); + }); + } + QueryBuilder sortByLang() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lang', Sort.asc); @@ -3659,6 +3746,18 @@ extension SourceQuerySortThenBy on QueryBuilder { }); } + QueryBuilder thenByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.asc); + }); + } + + QueryBuilder thenByItemTypeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'itemType', Sort.desc); + }); + } + QueryBuilder thenByLang() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'lang', Sort.asc); @@ -3887,6 +3986,12 @@ extension SourceQueryWhereDistinct on QueryBuilder { }); } + QueryBuilder distinctByItemType() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'itemType'); + }); + } + QueryBuilder distinctByLang( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -4065,6 +4170,12 @@ extension SourceQueryProperty on QueryBuilder { }); } + QueryBuilder itemTypeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'itemType'); + }); + } + QueryBuilder langProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'lang'); diff --git a/lib/modules/library/library_screen.dart b/lib/modules/library/library_screen.dart index b1b005ef..caa029fc 100644 --- a/lib/modules/library/library_screen.dart +++ b/lib/modules/library/library_screen.dart @@ -40,8 +40,8 @@ import 'package:mangayomi/modules/widgets/progress_center.dart'; import 'package:mangayomi/utils/global_style.dart'; class LibraryScreen extends ConsumerStatefulWidget { - final bool isManga; - const LibraryScreen({required this.isManga, super.key}); + final ItemType itemType; + const LibraryScreen({required this.itemType, super.key}); @override ConsumerState createState() => _LibraryScreenState(); @@ -83,13 +83,13 @@ class _LibraryScreenState extends ConsumerState final settings = settingsList.first; final categories = - ref.watch(getMangaCategorieStreamProvider(isManga: widget.isManga)); + ref.watch(getMangaCategorieStreamProvider(itemType: widget.itemType)); final withoutCategories = ref.watch( - getAllMangaWithoutCategoriesStreamProvider(isManga: widget.isManga)); + getAllMangaWithoutCategoriesStreamProvider(itemType: widget.itemType)); final showCategoryTabs = ref.watch(libraryShowCategoryTabsStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final mangaAll = ref.watch( - getAllMangaStreamProvider(categoryId: null, isManga: widget.isManga)); + getAllMangaStreamProvider(categoryId: null, itemType: widget.itemType)); final l10n = l10nLocalizations(context)!; return Scaffold( body: mangaAll.when( @@ -113,55 +113,55 @@ class _LibraryScreenState extends ConsumerState return Consumer(builder: (context, ref, child) { bool reverse = ref .watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)) + itemType: widget.itemType, settings: settings)) .reverse!; final continueReaderBtn = ref.watch( libraryShowContinueReadingButtonStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final showNumbersOfItems = ref.watch( libraryShowNumbersOfItemsStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final localSource = ref.watch( libraryLocalSourceStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final downloadedChapter = ref.watch( libraryDownloadedChaptersStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final language = ref.watch( libraryLanguageStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final displayType = ref.watch( libraryDisplayTypeStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final isNotFiltering = ref.watch( mangasFilterResultStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final downloadFilterType = ref.watch( mangaFilterDownloadedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final unreadFilterType = ref.watch( mangaFilterUnreadStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final startedFilterType = ref.watch( mangaFilterStartedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final bookmarkedFilterType = ref.watch( mangaFilterBookmarkedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final sortType = ref .watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)) + itemType: widget.itemType, settings: settings)) .index as int; final numberOfItemsList = _filterAndSortManga( data: man, @@ -364,53 +364,53 @@ class _LibraryScreenState extends ConsumerState return Consumer(builder: (context, ref, child) { bool reverse = ref .watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)) + itemType: widget.itemType, settings: settings)) .reverse!; final continueReaderBtn = ref.watch( libraryShowContinueReadingButtonStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final showNumbersOfItems = ref.watch( libraryShowNumbersOfItemsStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final localSource = ref.watch( libraryLocalSourceStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final downloadedChapter = ref.watch( libraryDownloadedChaptersStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final language = ref.watch(libraryLanguageStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final displayType = ref.watch( libraryDisplayTypeStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final isNotFiltering = ref.watch( mangasFilterResultStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final downloadFilterType = ref.watch( mangaFilterDownloadedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final unreadFilterType = ref.watch( mangaFilterUnreadStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final startedFilterType = ref.watch( mangaFilterStartedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final bookmarkedFilterType = ref.watch( mangaFilterBookmarkedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)); final sortType = ref .watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)) + itemType: widget.itemType, settings: settings)) .index; final numberOfItemsList = _filterAndSortManga( data: man, @@ -518,9 +518,9 @@ class _LibraryScreenState extends ConsumerState .set(); ref.invalidate( getAllMangaWithoutCategoriesStreamProvider( - isManga: widget.isManga)); + itemType: widget.itemType)); ref.invalidate(getAllMangaStreamProvider( - categoryId: null, isManga: widget.isManga)); + categoryId: null, itemType: widget.itemType)); }, child: Icon( Icons.done_all_sharp, @@ -545,9 +545,9 @@ class _LibraryScreenState extends ConsumerState .set(); ref.invalidate( getAllMangaWithoutCategoriesStreamProvider( - isManga: widget.isManga)); + itemType: widget.itemType)); ref.invalidate(getAllMangaStreamProvider( - categoryId: null, isManga: widget.isManga)); + categoryId: null, itemType: widget.itemType)); }, child: Icon( Icons.remove_done_sharp, @@ -611,10 +611,10 @@ class _LibraryScreenState extends ConsumerState required int categoryId, required Settings settings}) { final mangas = ref.watch(getAllMangaStreamProvider( - categoryId: categoryId, isManga: widget.isManga)); + categoryId: categoryId, itemType: widget.itemType)); final sortType = ref .watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)) + itemType: widget.itemType, settings: settings)) .index; return mangas.when( data: (data) { @@ -661,10 +661,10 @@ class _LibraryScreenState extends ConsumerState required Settings settings}) { final l10n = l10nLocalizations(context)!; final mangas = ref.watch(getAllMangaStreamProvider( - categoryId: categoryId, isManga: widget.isManga)); + categoryId: categoryId, itemType: widget.itemType)); final sortType = ref .watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)) + itemType: widget.itemType, settings: settings)) .index; final mangaIdsList = ref.watch(mangasListStateProvider); return Scaffold( @@ -702,7 +702,7 @@ class _LibraryScreenState extends ConsumerState language: language, mangaIdsList: mangaIdsList, localSource: localSource, - isManga: widget.isManga, + itemType: widget.itemType, ), ); } @@ -733,13 +733,13 @@ class _LibraryScreenState extends ConsumerState required Settings settings}) { final sortType = ref .watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)) + itemType: widget.itemType, settings: settings)) .index; final manga = withouCategories ? ref.watch( - getAllMangaWithoutCategoriesStreamProvider(isManga: widget.isManga)) + getAllMangaWithoutCategoriesStreamProvider(itemType: widget.itemType)) : ref.watch(getAllMangaStreamProvider( - categoryId: null, isManga: widget.isManga)); + categoryId: null, itemType: widget.itemType)); final mangaIdsList = ref.watch(mangasListStateProvider); final l10n = l10nLocalizations(context)!; return manga.when( @@ -776,7 +776,7 @@ class _LibraryScreenState extends ConsumerState language: language, mangaIdsList: mangaIdsList, localSource: localSource, - isManga: widget.isManga, + itemType: widget.itemType, ), ); } @@ -954,7 +954,7 @@ class _LibraryScreenState extends ConsumerState .filter() .idIsNotNull() .and() - .forMangaEqualTo(widget.isManga) + .forItemTypeEqualTo(widget.itemType) .watch(fireImmediately: true), builder: (context, snapshot) { return AlertDialog( @@ -1006,7 +1006,7 @@ class _LibraryScreenState extends ConsumerState onPressed: () { context.push("/categories", extra: ( true, - widget.isManga ? 0 : 1 + widget.itemType )); Navigator.pop(context); }, @@ -1059,7 +1059,7 @@ class _LibraryScreenState extends ConsumerState onPressed: () { context.push("/categories", extra: ( true, - widget.isManga ? 0 : 1 + widget.itemType )); Navigator.pop(context); }, @@ -1270,13 +1270,13 @@ class _LibraryScreenState extends ConsumerState ListTileChapterFilter( label: l10n.downloaded, type: ref.watch(mangaFilterDownloadedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)), onTap: () { ref .read(mangaFilterDownloadedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings) .notifier) @@ -1285,13 +1285,13 @@ class _LibraryScreenState extends ConsumerState ListTileChapterFilter( label: l10n.unread, type: ref.watch(mangaFilterUnreadStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)), onTap: () { ref .read(mangaFilterUnreadStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings) .notifier) @@ -1300,13 +1300,13 @@ class _LibraryScreenState extends ConsumerState ListTileChapterFilter( label: l10n.started, type: ref.watch(mangaFilterStartedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)), onTap: () { ref .read(mangaFilterStartedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings) .notifier) @@ -1315,14 +1315,14 @@ class _LibraryScreenState extends ConsumerState ListTileChapterFilter( label: l10n.bookmarked, type: ref.watch(mangaFilterBookmarkedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings)), onTap: () { setState(() { ref .read(mangaFilterBookmarkedStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, mangaList: _entries, settings: settings) .notifier) @@ -1335,11 +1335,11 @@ class _LibraryScreenState extends ConsumerState Consumer(builder: (context, ref, chil) { final reverse = ref .read(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings) + itemType: widget.itemType, settings: settings) .notifier) .isReverse(); final reverseChapter = ref.watch(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); return Column( children: [ for (var i = 0; i < 7; i++) @@ -1349,7 +1349,7 @@ class _LibraryScreenState extends ConsumerState onTap: () { ref .read(sortLibraryMangaStateProvider( - isManga: widget.isManga, settings: settings) + itemType: widget.itemType, settings: settings) .notifier) .set(i); }, @@ -1360,25 +1360,25 @@ class _LibraryScreenState extends ConsumerState }), Consumer(builder: (context, ref, chil) { final display = ref.watch(libraryDisplayTypeStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final displayV = ref.read(libraryDisplayTypeStateProvider( - isManga: widget.isManga, settings: settings) + itemType: widget.itemType, settings: settings) .notifier); final showCategoryTabs = ref.watch(libraryShowCategoryTabsStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final continueReaderBtn = ref.watch( libraryShowContinueReadingButtonStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final showNumbersOfItems = ref.watch( libraryShowNumbersOfItemsStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final downloadedChapter = ref.watch( libraryDownloadedChaptersStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final language = ref.watch(libraryLanguageStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); final localSource = ref.watch(libraryLocalSourceStateProvider( - isManga: widget.isManga, settings: settings)); + itemType: widget.itemType, settings: settings)); return SingleChildScrollView( physics: const NeverScrollableScrollPhysics(), child: Column( @@ -1451,7 +1451,7 @@ class _LibraryScreenState extends ConsumerState Consumer( builder: (context, ref, child) { final gridSize = ref.watch(libraryGridSizeStateProvider( - isManga: widget.isManga)) ?? + itemType: widget.itemType)) ?? 0; return Padding( padding: const EdgeInsets.only(left: 8, right: 8, top: 10), @@ -1484,14 +1484,14 @@ class _LibraryScreenState extends ConsumerState HapticFeedback.vibrate(); ref .read(libraryGridSizeStateProvider( - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .set(value.toInt()); }, onChangeEnd: (value) { ref .read(libraryGridSizeStateProvider( - isManga: widget.isManga) + itemType: widget.itemType) .notifier) .set(value.toInt(), end: true); }, @@ -1521,7 +1521,7 @@ class _LibraryScreenState extends ConsumerState onTap: () { ref .read(libraryDownloadedChaptersStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, settings: settings) .notifier) .set(!downloadedChapter); @@ -1532,7 +1532,7 @@ class _LibraryScreenState extends ConsumerState onTap: () { ref .read(libraryLanguageStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, settings: settings) .notifier) .set(!language); @@ -1543,7 +1543,7 @@ class _LibraryScreenState extends ConsumerState onTap: () { ref .read(libraryLocalSourceStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, settings: settings) .notifier) .set(!localSource); @@ -1555,7 +1555,7 @@ class _LibraryScreenState extends ConsumerState ref .read( libraryShowContinueReadingButtonStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, settings: settings) .notifier) .set(!continueReaderBtn); @@ -1579,7 +1579,7 @@ class _LibraryScreenState extends ConsumerState onTap: () { ref .read(libraryShowCategoryTabsStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, settings: settings) .notifier) .set(!showCategoryTabs); @@ -1590,7 +1590,7 @@ class _LibraryScreenState extends ConsumerState onTap: () { ref .read(libraryShowNumbersOfItemsStateProvider( - isManga: widget.isManga, + itemType: widget.itemType, settings: settings) .notifier) .set(!showNumbersOfItems); @@ -1636,9 +1636,9 @@ class _LibraryScreenState extends ConsumerState final mangaIdsList = ref.watch(mangasListStateProvider); final manga = categoryId == null ? ref.watch( - getAllMangaWithoutCategoriesStreamProvider(isManga: widget.isManga)) + getAllMangaWithoutCategoriesStreamProvider(itemType: widget.itemType)) : ref.watch(getAllMangaStreamProvider( - categoryId: categoryId, isManga: widget.isManga)); + categoryId: categoryId, itemType: widget.itemType)); final l10n = l10nLocalizations(context)!; return PreferredSize( preferredSize: Size.fromHeight(AppBar().preferredSize.height), @@ -1707,7 +1707,9 @@ class _LibraryScreenState extends ConsumerState : Row( children: [ Text( - widget.isManga ? l10n.manga : l10n.anime, + widget.itemType == ItemType.manga ? + l10n.manga : widget.itemType == ItemType.anime ? + l10n.anime : l10n.novel, style: TextStyle(color: Theme.of(context).hintColor), ), @@ -1783,7 +1785,7 @@ class _LibraryScreenState extends ConsumerState value: 1, child: Text(l10n.open_random_entry)), PopupMenuItem( value: 2, child: Text(l10n.import)), - if (!widget.isManga) + if (widget.itemType == ItemType.anime) PopupMenuItem( value: 3, child: Text(l10n.torrent_stream)), ]; @@ -1806,8 +1808,8 @@ class _LibraryScreenState extends ConsumerState source: randomManga.source!); }); } else if (value == 2) { - _importLocal(context, widget.isManga); - } else if (value == 3 && !widget.isManga) { + _importLocal(context, widget.itemType); + } else if (value == 3 && widget.itemType == ItemType.anime) { addTorrent(context); } }), @@ -1816,7 +1818,7 @@ class _LibraryScreenState extends ConsumerState } } -void _importLocal(BuildContext context, bool isManga) { +void _importLocal(BuildContext context, ItemType itemType) { final l10n = l10nLocalizations(context)!; bool isLoading = false; showDialog( @@ -1850,7 +1852,7 @@ void _importLocal(BuildContext context, bool isManga) { }); await ref.watch( importArchivesFromFileProvider( - isManga: isManga, + itemType: itemType, null, init: true) .future); @@ -1865,7 +1867,7 @@ void _importLocal(BuildContext context, bool isManga) { children: [ const Icon(Icons.archive_outlined), Text( - "${l10n.import_files} ( ${isManga ? ".zip, .cbz" : ".mp4, .mkv, .avi, and more"} )", + "${l10n.import_files} ( ${itemType == ItemType.manga ? ".zip, .cbz" : ".mp4, .mkv, .avi, and more"} )", style: TextStyle( color: Theme.of(context) .textTheme diff --git a/lib/modules/library/providers/isar_providers.dart b/lib/modules/library/providers/isar_providers.dart index fb964e8a..e03f9bc2 100644 --- a/lib/modules/library/providers/isar_providers.dart +++ b/lib/modules/library/providers/isar_providers.dart @@ -7,14 +7,14 @@ part 'isar_providers.g.dart'; @riverpod Stream> getAllMangaStream(GetAllMangaStreamRef ref, - {required int? categoryId, required bool? isManga}) async* { + {required int? categoryId, required ItemType itemType}) async* { yield* categoryId == null ? isar.mangas .filter() .idIsNotNull() .favoriteEqualTo(true) .and() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .watch(fireImmediately: true) : isar.mangas .filter() @@ -23,27 +23,27 @@ Stream> getAllMangaStream(GetAllMangaStreamRef ref, .categoriesIsNotEmpty() .categoriesElementEqualTo(categoryId) .and() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .watch(fireImmediately: true); } @riverpod Stream> getAllMangaWithoutCategoriesStream( GetAllMangaWithoutCategoriesStreamRef ref, - {required bool? isManga}) async* { + {required ItemType itemType}) async* { yield* isar.mangas .filter() .idIsNotNull() .favoriteEqualTo(true) .categoriesIsEmpty() .and() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .or() .idIsNotNull() .categoriesIsNull() .favoriteEqualTo(true) .and() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .watch(fireImmediately: true); } diff --git a/lib/modules/library/providers/isar_providers.g.dart b/lib/modules/library/providers/isar_providers.g.dart index d4be4a3d..e73bac38 100644 --- a/lib/modules/library/providers/isar_providers.g.dart +++ b/lib/modules/library/providers/isar_providers.g.dart @@ -6,7 +6,7 @@ part of 'isar_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$getAllMangaStreamHash() => r'd06c3a94ba847055746f2d52566cc94db4c28b7e'; +String _$getAllMangaStreamHash() => r'9073754a9086e922dd502e9333482342196a300c'; /// Copied from Dart SDK class _SystemHash { @@ -41,11 +41,11 @@ class GetAllMangaStreamFamily extends Family>> { /// See also [getAllMangaStream]. GetAllMangaStreamProvider call({ required int? categoryId, - required bool? isManga, + required ItemType itemType, }) { return GetAllMangaStreamProvider( categoryId: categoryId, - isManga: isManga, + itemType: itemType, ); } @@ -55,7 +55,7 @@ class GetAllMangaStreamFamily extends Family>> { ) { return call( categoryId: provider.categoryId, - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -79,12 +79,12 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider> { /// See also [getAllMangaStream]. GetAllMangaStreamProvider({ required int? categoryId, - required bool? isManga, + required ItemType itemType, }) : this._internal( (ref) => getAllMangaStream( ref as GetAllMangaStreamRef, categoryId: categoryId, - isManga: isManga, + itemType: itemType, ), from: getAllMangaStreamProvider, name: r'getAllMangaStreamProvider', @@ -96,7 +96,7 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider> { allTransitiveDependencies: GetAllMangaStreamFamily._allTransitiveDependencies, categoryId: categoryId, - isManga: isManga, + itemType: itemType, ); GetAllMangaStreamProvider._internal( @@ -107,11 +107,11 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider> { required super.debugGetCreateSourceHash, required super.from, required this.categoryId, - required this.isManga, + required this.itemType, }) : super.internal(); final int? categoryId; - final bool? isManga; + final ItemType itemType; @override Override overrideWith( @@ -127,7 +127,7 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider> { allTransitiveDependencies: null, debugGetCreateSourceHash: null, categoryId: categoryId, - isManga: isManga, + itemType: itemType, ), ); } @@ -141,14 +141,14 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider> { bool operator ==(Object other) { return other is GetAllMangaStreamProvider && other.categoryId == categoryId && - other.isManga == isManga; + other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, categoryId.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } @@ -158,8 +158,8 @@ mixin GetAllMangaStreamRef on AutoDisposeStreamProviderRef> { /// The parameter `categoryId` of this provider. int? get categoryId; - /// The parameter `isManga` of this provider. - bool? get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _GetAllMangaStreamProviderElement @@ -170,11 +170,11 @@ class _GetAllMangaStreamProviderElement @override int? get categoryId => (origin as GetAllMangaStreamProvider).categoryId; @override - bool? get isManga => (origin as GetAllMangaStreamProvider).isManga; + ItemType get itemType => (origin as GetAllMangaStreamProvider).itemType; } String _$getAllMangaWithoutCategoriesStreamHash() => - r'03581754f330a87894f953f8eaae528642b0afc2'; + r'd0ca0954d452102dc845a4aae414e88add666615'; /// See also [getAllMangaWithoutCategoriesStream]. @ProviderFor(getAllMangaWithoutCategoriesStream) @@ -189,10 +189,10 @@ class GetAllMangaWithoutCategoriesStreamFamily /// See also [getAllMangaWithoutCategoriesStream]. GetAllMangaWithoutCategoriesStreamProvider call({ - required bool? isManga, + required ItemType itemType, }) { return GetAllMangaWithoutCategoriesStreamProvider( - isManga: isManga, + itemType: itemType, ); } @@ -201,7 +201,7 @@ class GetAllMangaWithoutCategoriesStreamFamily covariant GetAllMangaWithoutCategoriesStreamProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -225,11 +225,11 @@ class GetAllMangaWithoutCategoriesStreamProvider extends AutoDisposeStreamProvider> { /// See also [getAllMangaWithoutCategoriesStream]. GetAllMangaWithoutCategoriesStreamProvider({ - required bool? isManga, + required ItemType itemType, }) : this._internal( (ref) => getAllMangaWithoutCategoriesStream( ref as GetAllMangaWithoutCategoriesStreamRef, - isManga: isManga, + itemType: itemType, ), from: getAllMangaWithoutCategoriesStreamProvider, name: r'getAllMangaWithoutCategoriesStreamProvider', @@ -240,7 +240,7 @@ class GetAllMangaWithoutCategoriesStreamProvider dependencies: GetAllMangaWithoutCategoriesStreamFamily._dependencies, allTransitiveDependencies: GetAllMangaWithoutCategoriesStreamFamily ._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, ); GetAllMangaWithoutCategoriesStreamProvider._internal( @@ -250,10 +250,10 @@ class GetAllMangaWithoutCategoriesStreamProvider 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( @@ -269,7 +269,7 @@ class GetAllMangaWithoutCategoriesStreamProvider dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, ), ); } @@ -282,13 +282,13 @@ class GetAllMangaWithoutCategoriesStreamProvider @override bool operator ==(Object other) { return other is GetAllMangaWithoutCategoriesStreamProvider && - other.isManga == isManga; + 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); } @@ -296,8 +296,8 @@ class GetAllMangaWithoutCategoriesStreamProvider mixin GetAllMangaWithoutCategoriesStreamRef on AutoDisposeStreamProviderRef> { - /// The parameter `isManga` of this provider. - bool? get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _GetAllMangaWithoutCategoriesStreamProviderElement @@ -306,8 +306,8 @@ class _GetAllMangaWithoutCategoriesStreamProviderElement _GetAllMangaWithoutCategoriesStreamProviderElement(super.provider); @override - bool? get isManga => - (origin as GetAllMangaWithoutCategoriesStreamProvider).isManga; + ItemType get itemType => + (origin as GetAllMangaWithoutCategoriesStreamProvider).itemType; } String _$getSettingsStreamHash() => r'273ef0597a1078ab7c31af861628f1be7ab154d8'; diff --git a/lib/modules/library/providers/library_state_provider.dart b/lib/modules/library/providers/library_state_provider.dart index 5e226418..e44cbee6 100644 --- a/lib/modules/library/providers/library_state_provider.dart +++ b/lib/modules/library/providers/library_state_provider.dart @@ -12,8 +12,15 @@ part 'library_state_provider.g.dart'; @riverpod class LibraryDisplayTypeState extends _$LibraryDisplayTypeState { @override - DisplayType build({required bool isManga, required Settings settings}) { - return isManga ? settings.displayType : settings.animeDisplayType; + DisplayType build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.displayType; + case ItemType.anime: + return settings.animeDisplayType; + default: + return settings.novelDisplayType; + } } String getLibraryDisplayTypeName( @@ -31,10 +38,16 @@ class LibraryDisplayTypeState extends _$LibraryDisplayTypeState { Settings appSettings = Settings(); state = displayType; - if (isManga) { - appSettings = settings..displayType = displayType; - } else { - appSettings = settings..animeDisplayType = displayType; + + switch (itemType) { + case ItemType.manga: + appSettings = settings..displayType = displayType; + break; + case ItemType.anime: + appSettings = settings..animeDisplayType = displayType; + break; + default: + appSettings = settings..novelDisplayType = displayType; } isar.writeTxnSync(() { @@ -46,8 +59,15 @@ class LibraryDisplayTypeState extends _$LibraryDisplayTypeState { @riverpod class LibraryGridSizeState extends _$LibraryGridSizeState { @override - int? build({required bool isManga}) { - return isManga ? settings.mangaGridSize : settings.animeGridSize; + int? build({required ItemType itemType}) { + switch (itemType) { + case ItemType.manga: + return settings.mangaGridSize; + case ItemType.anime: + return settings.animeGridSize; + default: + return settings.novelGridSize; + } } Settings get settings { @@ -59,10 +79,15 @@ class LibraryGridSizeState extends _$LibraryGridSizeState { state = value; if (end) { - if (isManga) { - appSettings = settings..mangaGridSize = value; - } else { - appSettings = settings..animeGridSize = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..mangaGridSize = value; + break; + case ItemType.anime: + appSettings = settings..animeGridSize = value; + break; + default: + appSettings = settings..novelGridSize = value; } isar.writeTxnSync(() { @@ -77,24 +102,34 @@ class MangaFilterDownloadedState extends _$MangaFilterDownloadedState { @override int build( {required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings}) { state = getType(); return getType(); } int getType() { - return isManga - ? settings.libraryFilterMangasDownloadType! - : settings.libraryFilterAnimeDownloadType ?? 0; + switch (itemType) { + case ItemType.manga: + return settings.libraryFilterMangasDownloadType!; + case ItemType.anime: + return settings.libraryFilterAnimeDownloadType!; + default: + return settings.libraryFilterNovelDownloadType ?? 0; + } } void setType(int type) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryFilterMangasDownloadType = type; - } else { - appSettings = settings..libraryFilterAnimeDownloadType = type; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryFilterMangasDownloadType = type; + break; + case ItemType.anime: + appSettings = settings..libraryFilterAnimeDownloadType = type; + break; + default: + appSettings = settings..libraryFilterNovelDownloadType = type; } isar.writeTxnSync(() { isar.settings.putSync(appSettings); @@ -118,24 +153,34 @@ class MangaFilterUnreadState extends _$MangaFilterUnreadState { @override int build( {required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings}) { state = getType(); return getType(); } int getType() { - return isManga - ? settings.libraryFilterMangasUnreadType! - : settings.libraryFilterAnimeUnreadType ?? 0; + switch (itemType) { + case ItemType.manga: + return settings.libraryFilterMangasUnreadType!; + case ItemType.anime: + return settings.libraryFilterAnimeUnreadType!; + default: + return settings.libraryFilterNovelUnreadType ?? 0; + } } void setType(int type) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryFilterMangasUnreadType = type; - } else { - appSettings = settings..libraryFilterAnimeUnreadType = type; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryFilterMangasUnreadType = type; + break; + case ItemType.anime: + appSettings = settings..libraryFilterAnimeUnreadType = type; + break; + default: + appSettings = settings..libraryFilterNovelUnreadType = type; } isar.writeTxnSync(() { isar.settings.putSync(appSettings); @@ -208,24 +253,34 @@ class MangaFilterStartedState extends _$MangaFilterStartedState { @override int build( {required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings}) { state = getType(); return getType(); } int getType() { - return isManga - ? settings.libraryFilterMangasStartedType! - : settings.libraryFilterAnimeStartedType ?? 0; + switch (itemType) { + case ItemType.manga: + return settings.libraryFilterMangasStartedType!; + case ItemType.anime: + return settings.libraryFilterAnimeStartedType!; + default: + return settings.libraryFilterNovelStartedType ?? 0; + } } void setType(int type) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryFilterMangasStartedType = type; - } else { - appSettings = settings..libraryFilterAnimeStartedType = type; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryFilterMangasStartedType = type; + break; + case ItemType.anime: + appSettings = settings..libraryFilterAnimeStartedType = type; + break; + default: + appSettings = settings..libraryFilterNovelStartedType = type; } isar.writeTxnSync(() { isar.settings.putSync(appSettings); @@ -298,24 +353,34 @@ class MangaFilterBookmarkedState extends _$MangaFilterBookmarkedState { @override int build( {required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings}) { state = getType(); return getType(); } int getType() { - return isManga - ? settings.libraryFilterMangasBookMarkedType! - : settings.libraryFilterAnimeBookMarkedType ?? 0; + switch (itemType) { + case ItemType.manga: + return settings.libraryFilterMangasBookMarkedType!; + case ItemType.anime: + return settings.libraryFilterAnimeBookMarkedType!; + default: + return settings.libraryFilterNovelBookMarkedType ?? 0; + } } void setType(int type) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryFilterMangasBookMarkedType = type; - } else { - appSettings = settings..libraryFilterAnimeBookMarkedType = type; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryFilterMangasBookMarkedType = type; + break; + case ItemType.anime: + appSettings = settings..libraryFilterAnimeBookMarkedType = type; + break; + default: + appSettings = settings..libraryFilterNovelBookMarkedType = type; } isar.writeTxnSync(() { isar.settings.putSync(appSettings); @@ -388,16 +453,16 @@ class MangasFilterResultState extends _$MangasFilterResultState { @override bool build( {required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings}) { final downloadFilterType = ref.watch(mangaFilterDownloadedStateProvider( - mangaList: mangaList, isManga: isManga, settings: settings)); + mangaList: mangaList, itemType: itemType, settings: settings)); final unreadFilterType = ref.watch(mangaFilterUnreadStateProvider( - mangaList: mangaList, isManga: isManga, settings: settings)); + mangaList: mangaList, itemType: itemType, settings: settings)); final startedFilterType = ref.watch(mangaFilterStartedStateProvider( - mangaList: mangaList, isManga: isManga, settings: settings)); + mangaList: mangaList, itemType: itemType, settings: settings)); final bookmarkedFilterType = ref.watch(mangaFilterBookmarkedStateProvider( - mangaList: mangaList, isManga: isManga, settings: settings)); + mangaList: mangaList, itemType: itemType, settings: settings)); return downloadFilterType == 0 && unreadFilterType == 0 && startedFilterType == 0 && @@ -408,18 +473,28 @@ class MangasFilterResultState extends _$MangasFilterResultState { @riverpod class LibraryShowCategoryTabsState extends _$LibraryShowCategoryTabsState { @override - bool build({required bool isManga, required Settings settings}) { - return isManga - ? settings.libraryShowCategoryTabs! - : settings.animeLibraryShowCategoryTabs ?? false; + bool build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.libraryShowCategoryTabs!; + case ItemType.anime: + return settings.animeLibraryShowCategoryTabs!; + default: + return settings.novelLibraryShowCategoryTabs ?? false; + } } void set(bool value) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryShowCategoryTabs = value; - } else { - appSettings = settings..animeLibraryShowCategoryTabs = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryShowCategoryTabs = value; + break; + case ItemType.anime: + appSettings = settings..animeLibraryShowCategoryTabs = value; + break; + default: + appSettings = settings..novelLibraryShowCategoryTabs = value; } state = value; isar.writeTxnSync(() { @@ -431,18 +506,28 @@ class LibraryShowCategoryTabsState extends _$LibraryShowCategoryTabsState { @riverpod class LibraryDownloadedChaptersState extends _$LibraryDownloadedChaptersState { @override - bool build({required bool isManga, required Settings settings}) { - return isManga - ? settings.libraryDownloadedChapters! - : settings.animeLibraryDownloadedChapters ?? false; + bool build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.libraryDownloadedChapters!; + case ItemType.anime: + return settings.animeLibraryDownloadedChapters!; + default: + return settings.novelLibraryDownloadedChapters ?? false; + } } void set(bool value) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryDownloadedChapters = value; - } else { - appSettings = settings..animeLibraryDownloadedChapters = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryDownloadedChapters = value; + break; + case ItemType.anime: + appSettings = settings..animeLibraryDownloadedChapters = value; + break; + default: + appSettings = settings..novelLibraryDownloadedChapters = value; } state = value; isar.writeTxnSync(() { @@ -454,18 +539,28 @@ class LibraryDownloadedChaptersState extends _$LibraryDownloadedChaptersState { @riverpod class LibraryLanguageState extends _$LibraryLanguageState { @override - bool build({required bool isManga, required Settings settings}) { - return isManga - ? settings.libraryShowLanguage! - : settings.animeLibraryShowLanguage ?? false; + bool build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.libraryShowLanguage!; + case ItemType.anime: + return settings.animeLibraryShowLanguage!; + default: + return settings.novelLibraryShowLanguage ?? false; + } } void set(bool value) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryShowLanguage = value; - } else { - appSettings = settings..animeLibraryShowLanguage = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryShowLanguage = value; + break; + case ItemType.anime: + appSettings = settings..animeLibraryShowLanguage = value; + break; + default: + appSettings = settings..novelLibraryShowLanguage = value; } state = value; isar.writeTxnSync(() { @@ -477,18 +572,28 @@ class LibraryLanguageState extends _$LibraryLanguageState { @riverpod class LibraryLocalSourceState extends _$LibraryLocalSourceState { @override - bool build({required bool isManga, required Settings settings}) { - return isManga - ? settings.libraryLocalSource ?? false - : settings.animeLibraryLocalSource ?? false; + bool build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.libraryLocalSource!; + case ItemType.anime: + return settings.animeLibraryLocalSource!; + default: + return settings.novelLibraryLocalSource ?? false; + } } void set(bool value) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryLocalSource = value; - } else { - appSettings = settings..animeLibraryLocalSource = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryLocalSource = value; + break; + case ItemType.anime: + appSettings = settings..animeLibraryLocalSource = value; + break; + default: + appSettings = settings..novelLibraryLocalSource = value; } state = value; isar.writeTxnSync(() { @@ -500,18 +605,28 @@ class LibraryLocalSourceState extends _$LibraryLocalSourceState { @riverpod class LibraryShowNumbersOfItemsState extends _$LibraryShowNumbersOfItemsState { @override - bool build({required bool isManga, required Settings settings}) { - return isManga - ? settings.libraryShowNumbersOfItems! - : settings.animeLibraryShowNumbersOfItems ?? false; + bool build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.libraryShowNumbersOfItems!; + case ItemType.anime: + return settings.animeLibraryShowNumbersOfItems!; + default: + return settings.novelLibraryShowNumbersOfItems ?? false; + } } void set(bool value) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryShowNumbersOfItems = value; - } else { - appSettings = settings..animeLibraryShowNumbersOfItems = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryShowNumbersOfItems = value; + break; + case ItemType.anime: + appSettings = settings..animeLibraryShowNumbersOfItems = value; + break; + default: + appSettings = settings..novelLibraryShowNumbersOfItems = value; } state = value; isar.writeTxnSync(() { @@ -524,18 +639,28 @@ class LibraryShowNumbersOfItemsState extends _$LibraryShowNumbersOfItemsState { class LibraryShowContinueReadingButtonState extends _$LibraryShowContinueReadingButtonState { @override - bool build({required bool isManga, required Settings settings}) { - return isManga - ? settings.libraryShowContinueReadingButton! - : settings.animeLibraryShowContinueReadingButton ?? false; + bool build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.libraryShowContinueReadingButton!; + case ItemType.anime: + return settings.animeLibraryShowContinueReadingButton!; + default: + return settings.novelLibraryShowContinueReadingButton ?? false; + } } void set(bool value) { Settings appSettings = Settings(); - if (isManga) { - appSettings = settings..libraryShowContinueReadingButton = value; - } else { - appSettings = settings..animeLibraryShowContinueReadingButton = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..libraryShowContinueReadingButton = value; + break; + case ItemType.anime: + appSettings = settings..animeLibraryShowContinueReadingButton = value; + break; + default: + appSettings = settings..novelLibraryShowContinueReadingButton = value; } state = value; isar.writeTxnSync(() { @@ -547,10 +672,15 @@ class LibraryShowContinueReadingButtonState @riverpod class SortLibraryMangaState extends _$SortLibraryMangaState { @override - SortLibraryManga build({required bool isManga, required Settings settings}) { - return isManga - ? settings.sortLibraryManga ?? SortLibraryManga() - : settings.sortLibraryAnime ?? SortLibraryManga(); + SortLibraryManga build({required ItemType itemType, required Settings settings}) { + switch (itemType) { + case ItemType.manga: + return settings.sortLibraryManga ?? SortLibraryManga(); + case ItemType.anime: + return settings.sortLibraryAnime ?? SortLibraryManga(); + default: + return settings.sortLibraryNovel ?? SortLibraryManga(); + } } void update(bool reverse, int index) { @@ -559,10 +689,15 @@ class SortLibraryMangaState extends _$SortLibraryMangaState { ..index = index ..reverse = state.index == index ? !reverse : reverse; - if (isManga) { - appSettings = settings..sortLibraryManga = value; - } else { - appSettings = settings..sortLibraryAnime = value; + switch (itemType) { + case ItemType.manga: + appSettings = settings..sortLibraryManga = value; + break; + case ItemType.anime: + appSettings = settings..sortLibraryAnime = value; + break; + default: + appSettings = settings..sortLibraryNovel = value; } isar.writeTxnSync(() { isar.settings.putSync(appSettings); diff --git a/lib/modules/library/providers/library_state_provider.g.dart b/lib/modules/library/providers/library_state_provider.g.dart index 5f2d9f57..313e27b9 100644 --- a/lib/modules/library/providers/library_state_provider.g.dart +++ b/lib/modules/library/providers/library_state_provider.g.dart @@ -7,7 +7,7 @@ part of 'library_state_provider.dart'; // ************************************************************************** String _$libraryDisplayTypeStateHash() => - r'9756e17b70fcb76aa6bac2a50e0927c2ad28717f'; + r'bcc3757a2aec544a3282776536a14e50cfafd03d'; /// Copied from Dart SDK class _SystemHash { @@ -32,11 +32,11 @@ class _SystemHash { abstract class _$LibraryDisplayTypeState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; DisplayType build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -52,11 +52,11 @@ class LibraryDisplayTypeStateFamily extends Family { /// See also [LibraryDisplayTypeState]. LibraryDisplayTypeStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return LibraryDisplayTypeStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -66,7 +66,7 @@ class LibraryDisplayTypeStateFamily extends Family { covariant LibraryDisplayTypeStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -91,11 +91,11 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< LibraryDisplayTypeState, DisplayType> { /// See also [LibraryDisplayTypeState]. LibraryDisplayTypeStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => LibraryDisplayTypeState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: libraryDisplayTypeStateProvider, name: r'libraryDisplayTypeStateProvider', @@ -106,7 +106,7 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< dependencies: LibraryDisplayTypeStateFamily._dependencies, allTransitiveDependencies: LibraryDisplayTypeStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -117,11 +117,11 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -129,7 +129,7 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< covariant LibraryDisplayTypeState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -140,14 +140,14 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< origin: this, override: LibraryDisplayTypeStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -162,14 +162,14 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< @override bool operator ==(Object other) { return other is LibraryDisplayTypeStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -178,8 +178,8 @@ class LibraryDisplayTypeStateProvider extends AutoDisposeNotifierProviderImpl< mixin LibraryDisplayTypeStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -191,20 +191,20 @@ class _LibraryDisplayTypeStateProviderElement _LibraryDisplayTypeStateProviderElement(super.provider); @override - bool get isManga => (origin as LibraryDisplayTypeStateProvider).isManga; + ItemType get itemType => (origin as LibraryDisplayTypeStateProvider).itemType; @override Settings get settings => (origin as LibraryDisplayTypeStateProvider).settings; } String _$libraryGridSizeStateHash() => - r'a4e55ef92f9387c2588679c5e2f23ef689e5d593'; + r'2b41e0dfd5fbc1b01ffc9ee4b5d3a99bce12df18'; abstract class _$LibraryGridSizeState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; int? build({ - required bool isManga, + required ItemType itemType, }); } @@ -219,10 +219,10 @@ class LibraryGridSizeStateFamily extends Family { /// See also [LibraryGridSizeState]. LibraryGridSizeStateProvider call({ - required bool isManga, + required ItemType itemType, }) { return LibraryGridSizeStateProvider( - isManga: isManga, + itemType: itemType, ); } @@ -231,7 +231,7 @@ class LibraryGridSizeStateFamily extends Family { covariant LibraryGridSizeStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -255,9 +255,9 @@ class LibraryGridSizeStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [LibraryGridSizeState]. LibraryGridSizeStateProvider({ - required bool isManga, + required ItemType itemType, }) : this._internal( - () => LibraryGridSizeState()..isManga = isManga, + () => LibraryGridSizeState()..itemType = itemType, from: libraryGridSizeStateProvider, name: r'libraryGridSizeStateProvider', debugGetCreateSourceHash: @@ -267,7 +267,7 @@ class LibraryGridSizeStateProvider dependencies: LibraryGridSizeStateFamily._dependencies, allTransitiveDependencies: LibraryGridSizeStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, ); LibraryGridSizeStateProvider._internal( @@ -277,17 +277,17 @@ class LibraryGridSizeStateProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, }) : super.internal(); - final bool isManga; + final ItemType itemType; @override int? runNotifierBuild( covariant LibraryGridSizeState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, ); } @@ -296,13 +296,13 @@ class LibraryGridSizeStateProvider return ProviderOverride( origin: this, override: LibraryGridSizeStateProvider._internal( - () => create()..isManga = isManga, + () => create()..itemType = itemType, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, ), ); } @@ -315,21 +315,21 @@ class LibraryGridSizeStateProvider @override bool operator ==(Object other) { - return other is LibraryGridSizeStateProvider && other.isManga == isManga; + return other is LibraryGridSizeStateProvider && 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 LibraryGridSizeStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _LibraryGridSizeStateProviderElement @@ -338,21 +338,21 @@ class _LibraryGridSizeStateProviderElement _LibraryGridSizeStateProviderElement(super.provider); @override - bool get isManga => (origin as LibraryGridSizeStateProvider).isManga; + ItemType get itemType => (origin as LibraryGridSizeStateProvider).itemType; } String _$mangaFilterDownloadedStateHash() => - r'9c07e64580061bf2cbf892ef679274913aaa3b20'; + r'455eb734a87b1d3be3e5684902734a9c8c98a330'; abstract class _$MangaFilterDownloadedState extends BuildlessAutoDisposeNotifier { late final List mangaList; - late final bool isManga; + late final ItemType itemType; late final Settings settings; int build({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -369,12 +369,12 @@ class MangaFilterDownloadedStateFamily extends Family { /// See also [MangaFilterDownloadedState]. MangaFilterDownloadedStateProvider call({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) { return MangaFilterDownloadedStateProvider( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -385,7 +385,7 @@ class MangaFilterDownloadedStateFamily extends Family { ) { return call( mangaList: provider.mangaList, - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -411,12 +411,12 @@ class MangaFilterDownloadedStateProvider /// See also [MangaFilterDownloadedState]. MangaFilterDownloadedStateProvider({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => MangaFilterDownloadedState() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: mangaFilterDownloadedStateProvider, name: r'mangaFilterDownloadedStateProvider', @@ -428,7 +428,7 @@ class MangaFilterDownloadedStateProvider allTransitiveDependencies: MangaFilterDownloadedStateFamily._allTransitiveDependencies, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -440,12 +440,12 @@ class MangaFilterDownloadedStateProvider required super.debugGetCreateSourceHash, required super.from, required this.mangaList, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); final List mangaList; - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -454,7 +454,7 @@ class MangaFilterDownloadedStateProvider ) { return notifier.build( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -466,7 +466,7 @@ class MangaFilterDownloadedStateProvider override: MangaFilterDownloadedStateProvider._internal( () => create() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, @@ -474,7 +474,7 @@ class MangaFilterDownloadedStateProvider allTransitiveDependencies: null, debugGetCreateSourceHash: null, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -490,7 +490,7 @@ class MangaFilterDownloadedStateProvider bool operator ==(Object other) { return other is MangaFilterDownloadedStateProvider && other.mangaList == mangaList && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @@ -498,7 +498,7 @@ class MangaFilterDownloadedStateProvider int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, mangaList.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -509,8 +509,8 @@ mixin MangaFilterDownloadedStateRef on AutoDisposeNotifierProviderRef { /// The parameter `mangaList` of this provider. List get mangaList; - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -525,24 +525,25 @@ class _MangaFilterDownloadedStateProviderElement List get mangaList => (origin as MangaFilterDownloadedStateProvider).mangaList; @override - bool get isManga => (origin as MangaFilterDownloadedStateProvider).isManga; + ItemType get itemType => + (origin as MangaFilterDownloadedStateProvider).itemType; @override Settings get settings => (origin as MangaFilterDownloadedStateProvider).settings; } String _$mangaFilterUnreadStateHash() => - r'ede01032c9a0a4e97028eb23c7bd91fa91b24a59'; + r'd48b9b0a5752befdab56601a1c8e2b36d797aeee'; abstract class _$MangaFilterUnreadState extends BuildlessAutoDisposeNotifier { late final List mangaList; - late final bool isManga; + late final ItemType itemType; late final Settings settings; int build({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -559,12 +560,12 @@ class MangaFilterUnreadStateFamily extends Family { /// See also [MangaFilterUnreadState]. MangaFilterUnreadStateProvider call({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) { return MangaFilterUnreadStateProvider( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -575,7 +576,7 @@ class MangaFilterUnreadStateFamily extends Family { ) { return call( mangaList: provider.mangaList, - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -601,12 +602,12 @@ class MangaFilterUnreadStateProvider /// See also [MangaFilterUnreadState]. MangaFilterUnreadStateProvider({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => MangaFilterUnreadState() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: mangaFilterUnreadStateProvider, name: r'mangaFilterUnreadStateProvider', @@ -618,7 +619,7 @@ class MangaFilterUnreadStateProvider allTransitiveDependencies: MangaFilterUnreadStateFamily._allTransitiveDependencies, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -630,12 +631,12 @@ class MangaFilterUnreadStateProvider required super.debugGetCreateSourceHash, required super.from, required this.mangaList, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); final List mangaList; - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -644,7 +645,7 @@ class MangaFilterUnreadStateProvider ) { return notifier.build( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -656,7 +657,7 @@ class MangaFilterUnreadStateProvider override: MangaFilterUnreadStateProvider._internal( () => create() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, @@ -664,7 +665,7 @@ class MangaFilterUnreadStateProvider allTransitiveDependencies: null, debugGetCreateSourceHash: null, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -680,7 +681,7 @@ class MangaFilterUnreadStateProvider bool operator ==(Object other) { return other is MangaFilterUnreadStateProvider && other.mangaList == mangaList && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @@ -688,7 +689,7 @@ class MangaFilterUnreadStateProvider int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, mangaList.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -699,8 +700,8 @@ mixin MangaFilterUnreadStateRef on AutoDisposeNotifierProviderRef { /// The parameter `mangaList` of this provider. List get mangaList; - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -715,23 +716,23 @@ class _MangaFilterUnreadStateProviderElement List get mangaList => (origin as MangaFilterUnreadStateProvider).mangaList; @override - bool get isManga => (origin as MangaFilterUnreadStateProvider).isManga; + ItemType get itemType => (origin as MangaFilterUnreadStateProvider).itemType; @override Settings get settings => (origin as MangaFilterUnreadStateProvider).settings; } String _$mangaFilterStartedStateHash() => - r'455594ef7515307787a136872090218f67102fbd'; + r'fc6c919aa27bf338825cd8c252927ae78b8da36c'; abstract class _$MangaFilterStartedState extends BuildlessAutoDisposeNotifier { late final List mangaList; - late final bool isManga; + late final ItemType itemType; late final Settings settings; int build({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -748,12 +749,12 @@ class MangaFilterStartedStateFamily extends Family { /// See also [MangaFilterStartedState]. MangaFilterStartedStateProvider call({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) { return MangaFilterStartedStateProvider( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -764,7 +765,7 @@ class MangaFilterStartedStateFamily extends Family { ) { return call( mangaList: provider.mangaList, - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -790,12 +791,12 @@ class MangaFilterStartedStateProvider /// See also [MangaFilterStartedState]. MangaFilterStartedStateProvider({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => MangaFilterStartedState() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: mangaFilterStartedStateProvider, name: r'mangaFilterStartedStateProvider', @@ -807,7 +808,7 @@ class MangaFilterStartedStateProvider allTransitiveDependencies: MangaFilterStartedStateFamily._allTransitiveDependencies, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -819,12 +820,12 @@ class MangaFilterStartedStateProvider required super.debugGetCreateSourceHash, required super.from, required this.mangaList, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); final List mangaList; - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -833,7 +834,7 @@ class MangaFilterStartedStateProvider ) { return notifier.build( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -845,7 +846,7 @@ class MangaFilterStartedStateProvider override: MangaFilterStartedStateProvider._internal( () => create() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, @@ -853,7 +854,7 @@ class MangaFilterStartedStateProvider allTransitiveDependencies: null, debugGetCreateSourceHash: null, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -869,7 +870,7 @@ class MangaFilterStartedStateProvider bool operator ==(Object other) { return other is MangaFilterStartedStateProvider && other.mangaList == mangaList && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @@ -877,7 +878,7 @@ class MangaFilterStartedStateProvider int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, mangaList.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -888,8 +889,8 @@ mixin MangaFilterStartedStateRef on AutoDisposeNotifierProviderRef { /// The parameter `mangaList` of this provider. List get mangaList; - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -904,23 +905,23 @@ class _MangaFilterStartedStateProviderElement List get mangaList => (origin as MangaFilterStartedStateProvider).mangaList; @override - bool get isManga => (origin as MangaFilterStartedStateProvider).isManga; + ItemType get itemType => (origin as MangaFilterStartedStateProvider).itemType; @override Settings get settings => (origin as MangaFilterStartedStateProvider).settings; } String _$mangaFilterBookmarkedStateHash() => - r'7761c3ab84367f165ed378992c904e13b590efed'; + r'b013800ec4e42ede752c7cbcb00575678444e8b5'; abstract class _$MangaFilterBookmarkedState extends BuildlessAutoDisposeNotifier { late final List mangaList; - late final bool isManga; + late final ItemType itemType; late final Settings settings; int build({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -937,12 +938,12 @@ class MangaFilterBookmarkedStateFamily extends Family { /// See also [MangaFilterBookmarkedState]. MangaFilterBookmarkedStateProvider call({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) { return MangaFilterBookmarkedStateProvider( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -953,7 +954,7 @@ class MangaFilterBookmarkedStateFamily extends Family { ) { return call( mangaList: provider.mangaList, - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -979,12 +980,12 @@ class MangaFilterBookmarkedStateProvider /// See also [MangaFilterBookmarkedState]. MangaFilterBookmarkedStateProvider({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => MangaFilterBookmarkedState() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: mangaFilterBookmarkedStateProvider, name: r'mangaFilterBookmarkedStateProvider', @@ -996,7 +997,7 @@ class MangaFilterBookmarkedStateProvider allTransitiveDependencies: MangaFilterBookmarkedStateFamily._allTransitiveDependencies, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -1008,12 +1009,12 @@ class MangaFilterBookmarkedStateProvider required super.debugGetCreateSourceHash, required super.from, required this.mangaList, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); final List mangaList; - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -1022,7 +1023,7 @@ class MangaFilterBookmarkedStateProvider ) { return notifier.build( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1034,7 +1035,7 @@ class MangaFilterBookmarkedStateProvider override: MangaFilterBookmarkedStateProvider._internal( () => create() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, @@ -1042,7 +1043,7 @@ class MangaFilterBookmarkedStateProvider allTransitiveDependencies: null, debugGetCreateSourceHash: null, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -1058,7 +1059,7 @@ class MangaFilterBookmarkedStateProvider bool operator ==(Object other) { return other is MangaFilterBookmarkedStateProvider && other.mangaList == mangaList && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @@ -1066,7 +1067,7 @@ class MangaFilterBookmarkedStateProvider int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, mangaList.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -1077,8 +1078,8 @@ mixin MangaFilterBookmarkedStateRef on AutoDisposeNotifierProviderRef { /// The parameter `mangaList` of this provider. List get mangaList; - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -1093,24 +1094,25 @@ class _MangaFilterBookmarkedStateProviderElement List get mangaList => (origin as MangaFilterBookmarkedStateProvider).mangaList; @override - bool get isManga => (origin as MangaFilterBookmarkedStateProvider).isManga; + ItemType get itemType => + (origin as MangaFilterBookmarkedStateProvider).itemType; @override Settings get settings => (origin as MangaFilterBookmarkedStateProvider).settings; } String _$mangasFilterResultStateHash() => - r'059fbe356805144bb533d4827d2c91b82aa3be10'; + r'c6f916c35e9b7125ba073d09aa6838605b933b20'; abstract class _$MangasFilterResultState extends BuildlessAutoDisposeNotifier { late final List mangaList; - late final bool isManga; + late final ItemType itemType; late final Settings settings; bool build({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -1127,12 +1129,12 @@ class MangasFilterResultStateFamily extends Family { /// See also [MangasFilterResultState]. MangasFilterResultStateProvider call({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) { return MangasFilterResultStateProvider( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1143,7 +1145,7 @@ class MangasFilterResultStateFamily extends Family { ) { return call( mangaList: provider.mangaList, - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -1169,12 +1171,12 @@ class MangasFilterResultStateProvider /// See also [MangasFilterResultState]. MangasFilterResultStateProvider({ required List mangaList, - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => MangasFilterResultState() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: mangasFilterResultStateProvider, name: r'mangasFilterResultStateProvider', @@ -1186,7 +1188,7 @@ class MangasFilterResultStateProvider allTransitiveDependencies: MangasFilterResultStateFamily._allTransitiveDependencies, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -1198,12 +1200,12 @@ class MangasFilterResultStateProvider required super.debugGetCreateSourceHash, required super.from, required this.mangaList, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); final List mangaList; - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -1212,7 +1214,7 @@ class MangasFilterResultStateProvider ) { return notifier.build( mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1224,7 +1226,7 @@ class MangasFilterResultStateProvider override: MangasFilterResultStateProvider._internal( () => create() ..mangaList = mangaList - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, @@ -1232,7 +1234,7 @@ class MangasFilterResultStateProvider allTransitiveDependencies: null, debugGetCreateSourceHash: null, mangaList: mangaList, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -1248,7 +1250,7 @@ class MangasFilterResultStateProvider bool operator ==(Object other) { return other is MangasFilterResultStateProvider && other.mangaList == mangaList && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @@ -1256,7 +1258,7 @@ class MangasFilterResultStateProvider int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, mangaList.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -1267,8 +1269,8 @@ mixin MangasFilterResultStateRef on AutoDisposeNotifierProviderRef { /// The parameter `mangaList` of this provider. List get mangaList; - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -1283,21 +1285,21 @@ class _MangasFilterResultStateProviderElement List get mangaList => (origin as MangasFilterResultStateProvider).mangaList; @override - bool get isManga => (origin as MangasFilterResultStateProvider).isManga; + ItemType get itemType => (origin as MangasFilterResultStateProvider).itemType; @override Settings get settings => (origin as MangasFilterResultStateProvider).settings; } String _$libraryShowCategoryTabsStateHash() => - r'd141fb5f427f1054aff3a33a34d89b7aec354935'; + r'f8136c8e7b343e50a4fd4884bc9874d888d08901'; abstract class _$LibraryShowCategoryTabsState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; bool build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -1314,11 +1316,11 @@ class LibraryShowCategoryTabsStateFamily extends Family { /// See also [LibraryShowCategoryTabsState]. LibraryShowCategoryTabsStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return LibraryShowCategoryTabsStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1328,7 +1330,7 @@ class LibraryShowCategoryTabsStateFamily extends Family { covariant LibraryShowCategoryTabsStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -1354,11 +1356,11 @@ class LibraryShowCategoryTabsStateProvider bool> { /// See also [LibraryShowCategoryTabsState]. LibraryShowCategoryTabsStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => LibraryShowCategoryTabsState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: libraryShowCategoryTabsStateProvider, name: r'libraryShowCategoryTabsStateProvider', @@ -1369,7 +1371,7 @@ class LibraryShowCategoryTabsStateProvider dependencies: LibraryShowCategoryTabsStateFamily._dependencies, allTransitiveDependencies: LibraryShowCategoryTabsStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -1380,11 +1382,11 @@ class LibraryShowCategoryTabsStateProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -1392,7 +1394,7 @@ class LibraryShowCategoryTabsStateProvider covariant LibraryShowCategoryTabsState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1403,14 +1405,14 @@ class LibraryShowCategoryTabsStateProvider origin: this, override: LibraryShowCategoryTabsStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -1425,14 +1427,14 @@ class LibraryShowCategoryTabsStateProvider @override bool operator ==(Object other) { return other is LibraryShowCategoryTabsStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -1440,8 +1442,8 @@ class LibraryShowCategoryTabsStateProvider } mixin LibraryShowCategoryTabsStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -1453,22 +1455,23 @@ class _LibraryShowCategoryTabsStateProviderElement _LibraryShowCategoryTabsStateProviderElement(super.provider); @override - bool get isManga => (origin as LibraryShowCategoryTabsStateProvider).isManga; + ItemType get itemType => + (origin as LibraryShowCategoryTabsStateProvider).itemType; @override Settings get settings => (origin as LibraryShowCategoryTabsStateProvider).settings; } String _$libraryDownloadedChaptersStateHash() => - r'00930ece1c84079525a2d73b03cd87f290184d36'; + r'1c93c624dfaa46ccd56de1841233d04fc63e18af'; abstract class _$LibraryDownloadedChaptersState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; bool build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -1485,11 +1488,11 @@ class LibraryDownloadedChaptersStateFamily extends Family { /// See also [LibraryDownloadedChaptersState]. LibraryDownloadedChaptersStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return LibraryDownloadedChaptersStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1499,7 +1502,7 @@ class LibraryDownloadedChaptersStateFamily extends Family { covariant LibraryDownloadedChaptersStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -1525,11 +1528,11 @@ class LibraryDownloadedChaptersStateProvider bool> { /// See also [LibraryDownloadedChaptersState]. LibraryDownloadedChaptersStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => LibraryDownloadedChaptersState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: libraryDownloadedChaptersStateProvider, name: r'libraryDownloadedChaptersStateProvider', @@ -1540,7 +1543,7 @@ class LibraryDownloadedChaptersStateProvider dependencies: LibraryDownloadedChaptersStateFamily._dependencies, allTransitiveDependencies: LibraryDownloadedChaptersStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -1551,11 +1554,11 @@ class LibraryDownloadedChaptersStateProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -1563,7 +1566,7 @@ class LibraryDownloadedChaptersStateProvider covariant LibraryDownloadedChaptersState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1574,14 +1577,14 @@ class LibraryDownloadedChaptersStateProvider origin: this, override: LibraryDownloadedChaptersStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -1596,14 +1599,14 @@ class LibraryDownloadedChaptersStateProvider @override bool operator ==(Object other) { return other is LibraryDownloadedChaptersStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -1612,8 +1615,8 @@ class LibraryDownloadedChaptersStateProvider mixin LibraryDownloadedChaptersStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -1625,23 +1628,23 @@ class _LibraryDownloadedChaptersStateProviderElement _LibraryDownloadedChaptersStateProviderElement(super.provider); @override - bool get isManga => - (origin as LibraryDownloadedChaptersStateProvider).isManga; + ItemType get itemType => + (origin as LibraryDownloadedChaptersStateProvider).itemType; @override Settings get settings => (origin as LibraryDownloadedChaptersStateProvider).settings; } String _$libraryLanguageStateHash() => - r'fea084aa32fa415c32aa2b93a9a1ba7c50d0fd41'; + r'83045a8db5fbad972fc1b956bbc8225f97fc03b4'; abstract class _$LibraryLanguageState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; bool build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -1657,11 +1660,11 @@ class LibraryLanguageStateFamily extends Family { /// See also [LibraryLanguageState]. LibraryLanguageStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return LibraryLanguageStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1671,7 +1674,7 @@ class LibraryLanguageStateFamily extends Family { covariant LibraryLanguageStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -1696,11 +1699,11 @@ class LibraryLanguageStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [LibraryLanguageState]. LibraryLanguageStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => LibraryLanguageState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: libraryLanguageStateProvider, name: r'libraryLanguageStateProvider', @@ -1711,7 +1714,7 @@ class LibraryLanguageStateProvider dependencies: LibraryLanguageStateFamily._dependencies, allTransitiveDependencies: LibraryLanguageStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -1722,11 +1725,11 @@ class LibraryLanguageStateProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -1734,7 +1737,7 @@ class LibraryLanguageStateProvider covariant LibraryLanguageState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1745,14 +1748,14 @@ class LibraryLanguageStateProvider origin: this, override: LibraryLanguageStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -1767,14 +1770,14 @@ class LibraryLanguageStateProvider @override bool operator ==(Object other) { return other is LibraryLanguageStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -1782,8 +1785,8 @@ class LibraryLanguageStateProvider } mixin LibraryLanguageStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -1795,21 +1798,21 @@ class _LibraryLanguageStateProviderElement _LibraryLanguageStateProviderElement(super.provider); @override - bool get isManga => (origin as LibraryLanguageStateProvider).isManga; + ItemType get itemType => (origin as LibraryLanguageStateProvider).itemType; @override Settings get settings => (origin as LibraryLanguageStateProvider).settings; } String _$libraryLocalSourceStateHash() => - r'9c180d682d0b653bbfc5788e189ee8f4bebd77ec'; + r'356648df45deac415cd5ce34e920ebe1fdc7a648'; abstract class _$LibraryLocalSourceState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; bool build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -1825,11 +1828,11 @@ class LibraryLocalSourceStateFamily extends Family { /// See also [LibraryLocalSourceState]. LibraryLocalSourceStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return LibraryLocalSourceStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1839,7 +1842,7 @@ class LibraryLocalSourceStateFamily extends Family { covariant LibraryLocalSourceStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -1864,11 +1867,11 @@ class LibraryLocalSourceStateProvider extends AutoDisposeNotifierProviderImpl { /// See also [LibraryLocalSourceState]. LibraryLocalSourceStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => LibraryLocalSourceState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: libraryLocalSourceStateProvider, name: r'libraryLocalSourceStateProvider', @@ -1879,7 +1882,7 @@ class LibraryLocalSourceStateProvider dependencies: LibraryLocalSourceStateFamily._dependencies, allTransitiveDependencies: LibraryLocalSourceStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -1890,11 +1893,11 @@ class LibraryLocalSourceStateProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -1902,7 +1905,7 @@ class LibraryLocalSourceStateProvider covariant LibraryLocalSourceState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -1913,14 +1916,14 @@ class LibraryLocalSourceStateProvider origin: this, override: LibraryLocalSourceStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -1935,14 +1938,14 @@ class LibraryLocalSourceStateProvider @override bool operator ==(Object other) { return other is LibraryLocalSourceStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -1950,8 +1953,8 @@ class LibraryLocalSourceStateProvider } mixin LibraryLocalSourceStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -1963,21 +1966,21 @@ class _LibraryLocalSourceStateProviderElement _LibraryLocalSourceStateProviderElement(super.provider); @override - bool get isManga => (origin as LibraryLocalSourceStateProvider).isManga; + ItemType get itemType => (origin as LibraryLocalSourceStateProvider).itemType; @override Settings get settings => (origin as LibraryLocalSourceStateProvider).settings; } String _$libraryShowNumbersOfItemsStateHash() => - r'fdef7a85fe68594e548f5affa40c72bf25fba2cf'; + r'8261b0ee660d36d284c53c45debfca7ceb7cbfd3'; abstract class _$LibraryShowNumbersOfItemsState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; bool build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -1994,11 +1997,11 @@ class LibraryShowNumbersOfItemsStateFamily extends Family { /// See also [LibraryShowNumbersOfItemsState]. LibraryShowNumbersOfItemsStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return LibraryShowNumbersOfItemsStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -2008,7 +2011,7 @@ class LibraryShowNumbersOfItemsStateFamily extends Family { covariant LibraryShowNumbersOfItemsStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -2034,11 +2037,11 @@ class LibraryShowNumbersOfItemsStateProvider bool> { /// See also [LibraryShowNumbersOfItemsState]. LibraryShowNumbersOfItemsStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => LibraryShowNumbersOfItemsState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: libraryShowNumbersOfItemsStateProvider, name: r'libraryShowNumbersOfItemsStateProvider', @@ -2049,7 +2052,7 @@ class LibraryShowNumbersOfItemsStateProvider dependencies: LibraryShowNumbersOfItemsStateFamily._dependencies, allTransitiveDependencies: LibraryShowNumbersOfItemsStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -2060,11 +2063,11 @@ class LibraryShowNumbersOfItemsStateProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -2072,7 +2075,7 @@ class LibraryShowNumbersOfItemsStateProvider covariant LibraryShowNumbersOfItemsState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -2083,14 +2086,14 @@ class LibraryShowNumbersOfItemsStateProvider origin: this, override: LibraryShowNumbersOfItemsStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -2105,14 +2108,14 @@ class LibraryShowNumbersOfItemsStateProvider @override bool operator ==(Object other) { return other is LibraryShowNumbersOfItemsStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -2121,8 +2124,8 @@ class LibraryShowNumbersOfItemsStateProvider mixin LibraryShowNumbersOfItemsStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -2134,23 +2137,23 @@ class _LibraryShowNumbersOfItemsStateProviderElement _LibraryShowNumbersOfItemsStateProviderElement(super.provider); @override - bool get isManga => - (origin as LibraryShowNumbersOfItemsStateProvider).isManga; + ItemType get itemType => + (origin as LibraryShowNumbersOfItemsStateProvider).itemType; @override Settings get settings => (origin as LibraryShowNumbersOfItemsStateProvider).settings; } String _$libraryShowContinueReadingButtonStateHash() => - r'28b1d4c45a55f5325903161b8fc4282cb6f4290e'; + r'a346c04b41c448c145107f862bbfa86f119edba1'; abstract class _$LibraryShowContinueReadingButtonState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; bool build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -2167,11 +2170,11 @@ class LibraryShowContinueReadingButtonStateFamily extends Family { /// See also [LibraryShowContinueReadingButtonState]. LibraryShowContinueReadingButtonStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return LibraryShowContinueReadingButtonStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -2181,7 +2184,7 @@ class LibraryShowContinueReadingButtonStateFamily extends Family { covariant LibraryShowContinueReadingButtonStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -2207,11 +2210,11 @@ class LibraryShowContinueReadingButtonStateProvider LibraryShowContinueReadingButtonState, bool> { /// See also [LibraryShowContinueReadingButtonState]. LibraryShowContinueReadingButtonStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => LibraryShowContinueReadingButtonState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: libraryShowContinueReadingButtonStateProvider, name: r'libraryShowContinueReadingButtonStateProvider', @@ -2223,7 +2226,7 @@ class LibraryShowContinueReadingButtonStateProvider LibraryShowContinueReadingButtonStateFamily._dependencies, allTransitiveDependencies: LibraryShowContinueReadingButtonStateFamily ._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -2234,11 +2237,11 @@ class LibraryShowContinueReadingButtonStateProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -2246,7 +2249,7 @@ class LibraryShowContinueReadingButtonStateProvider covariant LibraryShowContinueReadingButtonState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -2258,14 +2261,14 @@ class LibraryShowContinueReadingButtonStateProvider origin: this, override: LibraryShowContinueReadingButtonStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -2280,14 +2283,14 @@ class LibraryShowContinueReadingButtonStateProvider @override bool operator ==(Object other) { return other is LibraryShowContinueReadingButtonStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -2296,8 +2299,8 @@ class LibraryShowContinueReadingButtonStateProvider mixin LibraryShowContinueReadingButtonStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -2310,23 +2313,23 @@ class _LibraryShowContinueReadingButtonStateProviderElement _LibraryShowContinueReadingButtonStateProviderElement(super.provider); @override - bool get isManga => - (origin as LibraryShowContinueReadingButtonStateProvider).isManga; + ItemType get itemType => + (origin as LibraryShowContinueReadingButtonStateProvider).itemType; @override Settings get settings => (origin as LibraryShowContinueReadingButtonStateProvider).settings; } String _$sortLibraryMangaStateHash() => - r'0e18c577b3b88a6dede7533393c9b8f744b32a33'; + r'5454965fd1c6c027e5a2dfc93c2570e800bf18c0'; abstract class _$SortLibraryMangaState extends BuildlessAutoDisposeNotifier { - late final bool isManga; + late final ItemType itemType; late final Settings settings; SortLibraryManga build({ - required bool isManga, + required ItemType itemType, required Settings settings, }); } @@ -2342,11 +2345,11 @@ class SortLibraryMangaStateFamily extends Family { /// See also [SortLibraryMangaState]. SortLibraryMangaStateProvider call({ - required bool isManga, + required ItemType itemType, required Settings settings, }) { return SortLibraryMangaStateProvider( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -2356,7 +2359,7 @@ class SortLibraryMangaStateFamily extends Family { covariant SortLibraryMangaStateProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, settings: provider.settings, ); } @@ -2381,11 +2384,11 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< SortLibraryMangaState, SortLibraryManga> { /// See also [SortLibraryMangaState]. SortLibraryMangaStateProvider({ - required bool isManga, + required ItemType itemType, required Settings settings, }) : this._internal( () => SortLibraryMangaState() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: sortLibraryMangaStateProvider, name: r'sortLibraryMangaStateProvider', @@ -2396,7 +2399,7 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< dependencies: SortLibraryMangaStateFamily._dependencies, allTransitiveDependencies: SortLibraryMangaStateFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, settings: settings, ); @@ -2407,11 +2410,11 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, required this.settings, }) : super.internal(); - final bool isManga; + final ItemType itemType; final Settings settings; @override @@ -2419,7 +2422,7 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< covariant SortLibraryMangaState notifier, ) { return notifier.build( - isManga: isManga, + itemType: itemType, settings: settings, ); } @@ -2430,14 +2433,14 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< origin: this, override: SortLibraryMangaStateProvider._internal( () => create() - ..isManga = isManga + ..itemType = itemType ..settings = settings, from: from, name: null, dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, settings: settings, ), ); @@ -2452,14 +2455,14 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< @override bool operator ==(Object other) { return other is SortLibraryMangaStateProvider && - other.isManga == isManga && + other.itemType == itemType && other.settings == settings; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, settings.hashCode); return _SystemHash.finish(hash); @@ -2468,8 +2471,8 @@ class SortLibraryMangaStateProvider extends AutoDisposeNotifierProviderImpl< mixin SortLibraryMangaStateRef on AutoDisposeNotifierProviderRef { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `settings` of this provider. Settings get settings; @@ -2481,7 +2484,7 @@ class _SortLibraryMangaStateProviderElement _SortLibraryMangaStateProviderElement(super.provider); @override - bool get isManga => (origin as SortLibraryMangaStateProvider).isManga; + ItemType get itemType => (origin as SortLibraryMangaStateProvider).itemType; @override Settings get settings => (origin as SortLibraryMangaStateProvider).settings; } diff --git a/lib/modules/library/providers/local_archive.dart b/lib/modules/library/providers/local_archive.dart index e7dfe1bb..15b75f2f 100644 --- a/lib/modules/library/providers/local_archive.dart +++ b/lib/modules/library/providers/local_archive.dart @@ -10,11 +10,11 @@ part 'local_archive.g.dart'; @riverpod Future importArchivesFromFile(ImportArchivesFromFileRef ref, Manga? mManga, - {required bool isManga, required bool init}) async { + {required ItemType itemType, required bool init}) async { FilePickerResult? result = await FilePicker.platform.pickFiles( allowMultiple: true, type: FileType.custom, - allowedExtensions: isManga + allowedExtensions: itemType == ItemType.manga ? ['cbz', 'zip'] : ['mp4', 'mov', 'avi', 'flv', 'wmv', 'mpeg', 'mkv']); if (result != null) { @@ -24,7 +24,8 @@ Future importArchivesFromFile(ImportArchivesFromFileRef ref, Manga? mManga, favorite: true, source: 'archive', author: '', - isManga: isManga, + isManga: itemType == ItemType.manga, + itemType: itemType, genre: [], imageUrl: '', lang: '', @@ -38,20 +39,20 @@ Future importArchivesFromFile(ImportArchivesFromFileRef ref, Manga? mManga, artist: '', ); for (var file in result.files.reversed.toList()) { - (String, LocalExtensionType, Uint8List, String)? data = isManga + (String, LocalExtensionType, Uint8List, String)? data = itemType == ItemType.manga ? await ref.watch(getArchivesDataFromFileProvider(file.path!).future) : null; String name = _getName(file.path!); if (init) { - manga.customCoverImage = isManga ? data!.$3 : null; + manga.customCoverImage = itemType == ItemType.manga ? data!.$3 : null; } isar.writeTxnSync(() { isar.mangas.putSync(manga); final chapters = Chapter( - name: isManga ? data!.$1 : name, - archivePath: isManga ? data!.$4 : file.path, + name: itemType == ItemType.manga ? data!.$1 : name, + archivePath: itemType == ItemType.manga ? data!.$4 : file.path, mangaId: manga.id) ..manga.value = manga; isar.chapters.putSync(chapters); diff --git a/lib/modules/library/providers/local_archive.g.dart b/lib/modules/library/providers/local_archive.g.dart index 7a037c9f..b0135317 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'4ac9e6c438919a1ea8cebd28cb554b13b5e53cc2'; + r'08e34a4b0ba52b8d3861b297f687c1136f2c5443'; /// Copied from Dart SDK class _SystemHash { @@ -42,12 +42,12 @@ class ImportArchivesFromFileFamily extends Family { /// See also [importArchivesFromFile]. ImportArchivesFromFileProvider call( Manga? mManga, { - required bool isManga, + required ItemType itemType, required bool init, }) { return ImportArchivesFromFileProvider( mManga, - isManga: isManga, + itemType: itemType, init: init, ); } @@ -58,7 +58,7 @@ class ImportArchivesFromFileFamily extends Family { ) { return call( provider.mManga, - isManga: provider.isManga, + itemType: provider.itemType, init: provider.init, ); } @@ -84,13 +84,13 @@ class ImportArchivesFromFileProvider /// See also [importArchivesFromFile]. ImportArchivesFromFileProvider( Manga? mManga, { - required bool isManga, + required ItemType itemType, required bool init, }) : this._internal( (ref) => importArchivesFromFile( ref as ImportArchivesFromFileRef, mManga, - isManga: isManga, + itemType: itemType, init: init, ), from: importArchivesFromFileProvider, @@ -103,7 +103,7 @@ class ImportArchivesFromFileProvider allTransitiveDependencies: ImportArchivesFromFileFamily._allTransitiveDependencies, mManga: mManga, - isManga: isManga, + itemType: itemType, init: init, ); @@ -115,12 +115,12 @@ class ImportArchivesFromFileProvider required super.debugGetCreateSourceHash, required super.from, required this.mManga, - required this.isManga, + required this.itemType, required this.init, }) : super.internal(); final Manga? mManga; - final bool isManga; + final ItemType itemType; final bool init; @override @@ -137,7 +137,7 @@ class ImportArchivesFromFileProvider allTransitiveDependencies: null, debugGetCreateSourceHash: null, mManga: mManga, - isManga: isManga, + itemType: itemType, init: init, ), ); @@ -152,7 +152,7 @@ class ImportArchivesFromFileProvider bool operator ==(Object other) { return other is ImportArchivesFromFileProvider && other.mManga == mManga && - other.isManga == isManga && + other.itemType == itemType && other.init == init; } @@ -160,7 +160,7 @@ class ImportArchivesFromFileProvider int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); hash = _SystemHash.combine(hash, mManga.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); hash = _SystemHash.combine(hash, init.hashCode); return _SystemHash.finish(hash); @@ -171,8 +171,8 @@ mixin ImportArchivesFromFileRef on AutoDisposeFutureProviderRef { /// The parameter `mManga` of this provider. Manga? get mManga; - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; /// The parameter `init` of this provider. bool get init; @@ -186,7 +186,7 @@ class _ImportArchivesFromFileProviderElement @override Manga? get mManga => (origin as ImportArchivesFromFileProvider).mManga; @override - bool get isManga => (origin as ImportArchivesFromFileProvider).isManga; + ItemType get itemType => (origin as ImportArchivesFromFileProvider).itemType; @override bool get init => (origin as ImportArchivesFromFileProvider).init; } diff --git a/lib/modules/library/widgets/library_gridview_widget.dart b/lib/modules/library/widgets/library_gridview_widget.dart index 31a90a6e..7f10e615 100644 --- a/lib/modules/library/widgets/library_gridview_widget.dart +++ b/lib/modules/library/widgets/library_gridview_widget.dart @@ -29,7 +29,7 @@ class LibraryGridViewWidget extends StatefulWidget { final bool downloadedChapter; final bool continueReaderBtn; final bool localSource; - final bool isManga; + final ItemType itemType; const LibraryGridViewWidget( {super.key, required this.entriesManga, @@ -40,7 +40,7 @@ class LibraryGridViewWidget extends StatefulWidget { required this.continueReaderBtn, required this.mangaIdsList, required this.localSource, - required this.isManga}); + required this.itemType}); @override State createState() => _LibraryGridViewWidgetState(); @@ -51,10 +51,10 @@ class _LibraryGridViewWidgetState extends State { Widget build(BuildContext context) { return Consumer(builder: (context, ref, child) { final isLongPressed = ref.watch(isLongPressedMangaStateProvider); - final isManga = widget.isManga; + final itemType = widget.itemType; final gridSize = - ref.watch(libraryGridSizeStateProvider(isManga: isManga)); + ref.watch(libraryGridSizeStateProvider(itemType: itemType)); return GridViewWidget( gridSize: gridSize, childAspectRatio: widget.isComfortableGrid ? 0.642 : 0.69, @@ -97,9 +97,9 @@ class _LibraryGridViewWidgetState extends State { mangaM: entry, source: entry.source!); ref.invalidate(getAllMangaWithoutCategoriesStreamProvider( - isManga: widget.isManga)); + itemType: widget.itemType)); ref.invalidate(getAllMangaStreamProvider( - categoryId: null, isManga: widget.isManga)); + categoryId: null, itemType: widget.itemType)); } }, onLongPress: () { diff --git a/lib/modules/library/widgets/library_listview_widget.dart b/lib/modules/library/widgets/library_listview_widget.dart index 7123a8e8..a3bb4e64 100644 --- a/lib/modules/library/widgets/library_listview_widget.dart +++ b/lib/modules/library/widgets/library_listview_widget.dart @@ -59,9 +59,9 @@ class LibraryListViewWidget extends StatelessWidget { mangaM: entry, source: entry.source!); ref.invalidate(getAllMangaWithoutCategoriesStreamProvider( - isManga: entry.isManga)); + itemType: entry.itemType)); ref.invalidate(getAllMangaStreamProvider( - categoryId: null, isManga: entry.isManga)); + categoryId: null, itemType: entry.itemType)); } }, onLongPress: () { diff --git a/lib/modules/main_view/main_screen.dart b/lib/modules/main_view/main_screen.dart index dfde4b29..19b1bb79 100644 --- a/lib/modules/main_view/main_screen.dart +++ b/lib/modules/main_view/main_screen.dart @@ -39,10 +39,10 @@ class MainScreen extends ConsumerWidget { routerCurrentLocationStateProvider(context), ); bool isReadingScreen = - location == '/mangareaderview' || location == '/animePlayerView'; + location == '/mangaReaderView' || location == '/animePlayerView' || location == '/novelReaderView'; int currentIndex = switch (location) { null || '/MangaLibrary' => 0, - '/AnimeLibrary' => 1, + '/AnimeLibrary' => 1, // TODO add /NovelLibrary '/updates' => 2, '/history' => 3, '/browse' => 4, diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index 0c865a3e..a7b801dc 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -636,8 +636,9 @@ class _MangaDetailViewState extends ConsumerState manga: manga); } else { await ref.watch(importArchivesFromFileProvider( - isManga: manga - .isManga!, + itemType: + manga + .itemType, manga, init: false) @@ -1393,7 +1394,7 @@ class _MangaDetailViewState extends ConsumerState } else { await ref.watch( importArchivesFromFileProvider( - isManga: manga.isManga!, + itemType: manga.itemType, manga, init: false) .future); diff --git a/lib/modules/manga/detail/manga_details_view.dart b/lib/modules/manga/detail/manga_details_view.dart index 73b188f6..05e93347 100644 --- a/lib/modules/manga/detail/manga_details_view.dart +++ b/lib/modules/manga/detail/manga_details_view.dart @@ -196,7 +196,7 @@ class _MangaDetailsViewState extends ConsumerState { .filter() .idIsNotNull() .and() - .forMangaEqualTo(widget.manga.isManga) + .forItemTypeEqualTo(widget.manga.itemType) .isNotEmptySync(); if (checkCategoryList) { _openCategory(widget.manga); @@ -257,7 +257,7 @@ class _MangaDetailsViewState extends ConsumerState { .filter() .idIsNotNull() .and() - .forMangaEqualTo(widget.manga.isManga) + .forItemTypeEqualTo(widget.manga.itemType) .watch(fireImmediately: true), builder: (context, snapshot) { if (snapshot.hasData && snapshot.data!.isNotEmpty) { diff --git a/lib/modules/manga/home/manga_home_screen.dart b/lib/modules/manga/home/manga_home_screen.dart index c782cfe1..52ab33c8 100644 --- a/lib/modules/manga/home/manga_home_screen.dart +++ b/lib/modules/manga/home/manga_home_screen.dart @@ -555,7 +555,7 @@ class _MangaHomeScreenState extends ConsumerState { : Consumer(builder: (context, ref, child) { final gridSize = ref.watch( libraryGridSizeStateProvider( - isManga: source.isManga!)); + itemType: source.itemType)); return GridViewWidget( gridSize: gridSize, diff --git a/lib/modules/manga/reader/providers/push_router.dart b/lib/modules/manga/reader/providers/push_router.dart index abde10cb..c55f54d5 100644 --- a/lib/modules/manga/reader/providers/push_router.dart +++ b/lib/modules/manga/reader/providers/push_router.dart @@ -3,6 +3,7 @@ import 'package:go_router/go_router.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; Future pushMangaReaderView({ @@ -23,19 +24,31 @@ Future pushMangaReaderView({ .findAllSync() .isNotEmpty; if (sourceExist || chapter.manga.value!.isLocalArchive!) { - if (chapter.manga.value!.isManga!) { - await context.push('/mangareaderview', extra: chapter); - } else { - await context.push('/animePlayerView', extra: chapter); + switch (chapter.manga.value!.itemType) { + case ItemType.manga: + await context.push('/mangaReaderView', extra: chapter); + break; + case ItemType.anime: + await context.push('/animePlayerView', extra: chapter); + break; + case ItemType.novel: + await context.push('/novelReaderView', extra: chapter); + break; } } } void pushReplacementMangaReaderView( {required BuildContext context, required Chapter chapter}) { - if (chapter.manga.value!.isManga!) { - context.pushReplacement('/mangareaderview', extra: chapter); - } else { - context.pushReplacement('/animePlayerView', extra: chapter); - } + switch (chapter.manga.value!.itemType) { + case ItemType.manga: + context.pushReplacement('/mangaReaderView', extra: chapter); + break; + case ItemType.anime: + context.pushReplacement('/animePlayerView', extra: chapter); + break; + case ItemType.novel: + context.pushReplacement('/novelReaderView', extra: chapter); + break; + } } diff --git a/lib/modules/more/categories/categories_screen.dart b/lib/modules/more/categories/categories_screen.dart index 4e209c7c..c0262d24 100644 --- a/lib/modules/more/categories/categories_screen.dart +++ b/lib/modules/more/categories/categories_screen.dart @@ -2,6 +2,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/category.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/more/categories/providers/isar_providers.dart'; import 'package:mangayomi/modules/more/categories/widgets/custom_textfield.dart'; import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; @@ -52,10 +53,13 @@ class _CategoriesScreenState extends ConsumerState ), body: TabBarView(controller: _tabBarController, children: const [ CategoriesTab( - isManga: true, + itemType: ItemType.manga, ), CategoriesTab( - isManga: false, + itemType: ItemType.anime, + ), + CategoriesTab( + itemType: ItemType.novel, ) ]), ), @@ -64,8 +68,8 @@ class _CategoriesScreenState extends ConsumerState } class CategoriesTab extends ConsumerStatefulWidget { - final bool isManga; - const CategoriesTab({required this.isManga, super.key}); + final ItemType itemType; + const CategoriesTab({required this.itemType, super.key}); @override ConsumerState createState() => _CategoriesTabState(); @@ -77,7 +81,7 @@ class _CategoriesTabState extends ConsumerState { Widget build(BuildContext context) { final l10n = l10nLocalizations(context)!; final categories = - ref.watch(getMangaCategorieStreamProvider(isManga: widget.isManga)); + ref.watch(getMangaCategorieStreamProvider(itemType: widget.itemType)); return Scaffold( body: categories.when( data: (data) { @@ -279,7 +283,7 @@ class _CategoriesTabState extends ConsumerState { : () async { await isar.writeTxn(() async { await isar.categorys.put(Category( - forManga: widget.isManga, + forItemType: widget.itemType, name: controller.text, )); }); diff --git a/lib/modules/more/categories/providers/isar_providers.dart b/lib/modules/more/categories/providers/isar_providers.dart index a5c0314c..c116c98f 100644 --- a/lib/modules/more/categories/providers/isar_providers.dart +++ b/lib/modules/more/categories/providers/isar_providers.dart @@ -1,16 +1,17 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/category.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'isar_providers.g.dart'; @riverpod Stream> getMangaCategorieStream(GetMangaCategorieStreamRef ref, - {required bool isManga}) async* { + {required ItemType itemType}) async* { yield* isar.categorys .filter() .idIsNotNull() .and() - .forMangaEqualTo(isManga) + .forItemTypeEqualTo(itemType) .watch(fireImmediately: true); } diff --git a/lib/modules/more/categories/providers/isar_providers.g.dart b/lib/modules/more/categories/providers/isar_providers.g.dart index 288827fa..40641cdd 100644 --- a/lib/modules/more/categories/providers/isar_providers.g.dart +++ b/lib/modules/more/categories/providers/isar_providers.g.dart @@ -7,7 +7,7 @@ part of 'isar_providers.dart'; // ************************************************************************** String _$getMangaCategorieStreamHash() => - r'16b3a35e4962b39a2948a257eba66124bbff139a'; + r'4bf633ef6dc6720ac486f1fb6e3a2a57e18262ce'; /// Copied from Dart SDK class _SystemHash { @@ -41,10 +41,10 @@ class GetMangaCategorieStreamFamily extends Family>> { /// See also [getMangaCategorieStream]. GetMangaCategorieStreamProvider call({ - required bool isManga, + required ItemType itemType, }) { return GetMangaCategorieStreamProvider( - isManga: isManga, + itemType: itemType, ); } @@ -53,7 +53,7 @@ class GetMangaCategorieStreamFamily extends Family>> { covariant GetMangaCategorieStreamProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -77,11 +77,11 @@ class GetMangaCategorieStreamProvider extends AutoDisposeStreamProvider> { /// See also [getMangaCategorieStream]. GetMangaCategorieStreamProvider({ - required bool isManga, + required ItemType itemType, }) : this._internal( (ref) => getMangaCategorieStream( ref as GetMangaCategorieStreamRef, - isManga: isManga, + itemType: itemType, ), from: getMangaCategorieStreamProvider, name: r'getMangaCategorieStreamProvider', @@ -92,7 +92,7 @@ class GetMangaCategorieStreamProvider dependencies: GetMangaCategorieStreamFamily._dependencies, allTransitiveDependencies: GetMangaCategorieStreamFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, ); GetMangaCategorieStreamProvider._internal( @@ -102,10 +102,10 @@ class GetMangaCategorieStreamProvider 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 GetMangaCategorieStreamProvider dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, ), ); } @@ -132,13 +132,14 @@ class GetMangaCategorieStreamProvider @override bool operator ==(Object other) { - return other is GetMangaCategorieStreamProvider && other.isManga == isManga; + return other is GetMangaCategorieStreamProvider && + 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); } @@ -146,8 +147,8 @@ class GetMangaCategorieStreamProvider mixin GetMangaCategorieStreamRef on AutoDisposeStreamProviderRef> { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _GetMangaCategorieStreamProviderElement @@ -156,7 +157,7 @@ class _GetMangaCategorieStreamProviderElement _GetMangaCategorieStreamProviderElement(super.provider); @override - bool get isManga => (origin as GetMangaCategorieStreamProvider).isManga; + ItemType get itemType => (origin as GetMangaCategorieStreamProvider).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/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart new file mode 100644 index 00000000..c4dc4c90 --- /dev/null +++ b/lib/modules/novel/novel_reader_view.dart @@ -0,0 +1,2424 @@ +/* import 'dart:async'; +import 'dart:math'; +import 'dart:io'; +import 'package:extended_image/extended_image.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:flutter/rendering.dart'; +import 'package:flutter/services.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; +import 'package:mangayomi/eval/dart/model/m_bridge.dart'; +import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/manga.dart'; +import 'package:mangayomi/models/page.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:mangayomi/modules/anime/widgets/desktop.dart'; +import 'package:mangayomi/modules/manga/reader/providers/crop_borders_provider.dart'; +import 'package:mangayomi/modules/manga/reader/widgets/btn_chapter_list_dialog.dart'; +import 'package:mangayomi/modules/manga/reader/double_columm_view_vertical.dart'; +import 'package:mangayomi/modules/manga/reader/double_columm_view_center.dart'; +import 'package:mangayomi/modules/manga/reader/providers/color_filter_provider.dart'; +import 'package:mangayomi/modules/manga/reader/widgets/color_filter_widget.dart'; +import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; +import 'package:mangayomi/modules/widgets/custom_draggable_tabbar.dart'; +import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/providers/storage_provider.dart'; +import 'package:mangayomi/utils/utils.dart'; +import 'package:mangayomi/modules/manga/reader/providers/push_router.dart'; +import 'package:mangayomi/services/get_chapter_pages.dart'; +import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; +import 'package:mangayomi/utils/extensions/others.dart'; +import 'package:mangayomi/utils/global_style.dart'; +import 'package:mangayomi/utils/headers.dart'; +import 'package:mangayomi/modules/manga/reader/image_view_paged.dart'; +import 'package:mangayomi/modules/manga/reader/image_view_vertical.dart'; +import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; +import 'package:mangayomi/modules/manga/reader/widgets/circular_progress_indicator_animate_rotate.dart'; +import 'package:mangayomi/modules/more/settings/reader/reader_screen.dart'; +import 'package:mangayomi/modules/widgets/progress_center.dart'; +import 'package:mangayomi/utils/reg_exp_matcher.dart'; +import 'package:photo_view/photo_view.dart'; +import 'package:photo_view/photo_view_gallery.dart'; +import 'package:scrollable_positioned_list/scrollable_positioned_list.dart'; +import 'package:share_plus/share_plus.dart'; +import 'package:url_launcher/url_launcher.dart'; +import 'package:window_manager/window_manager.dart'; + +typedef DoubleClickAnimationListener = void Function(); + +class NovelReaderView extends ConsumerWidget { + final Chapter chapter; + const NovelReaderView({ + super.key, + required this.chapter, + }); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final chapterData = ref.watch(getChapterPagesProvider( + chapter: chapter, + )); + + return chapterData.when( + data: (data) { + if (data.pageUrls.isEmpty && + (chapter.manga.value!.isLocalArchive ?? false) == false) { + return Scaffold( + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + appBar: AppBar( + title: const Text(''), + leading: BackButton( + onPressed: () { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, + overlays: SystemUiOverlay.values); + Navigator.pop(context); + }, + ), + ), + body: const Center( + child: Text("Error"), + ), + ); + } + return MangaChapterPageGallery(chapter: chapter, chapterUrlModel: data); + }, + error: (error, stackTrace) => Scaffold( + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + appBar: AppBar( + title: const Text(''), + leading: BackButton( + onPressed: () { + Navigator.pop(context); + }, + ), + ), + body: Center( + child: Text(error.toString()), + ), + ), + loading: () { + return Scaffold( + backgroundColor: Theme.of(context).scaffoldBackgroundColor, + appBar: AppBar( + title: const Text(''), + leading: BackButton( + onPressed: () { + Navigator.pop(context); + }, + ), + ), + body: const ProgressCenter(), + ); + }, + ); + } +} + +class MangaChapterPageGallery extends ConsumerStatefulWidget { + const MangaChapterPageGallery({ + super.key, + required this.chapter, + required this.chapterUrlModel, + }); + final GetChapterPagesModel chapterUrlModel; + + final Chapter chapter; + + @override + ConsumerState createState() { + return _MangaChapterPageGalleryState(); + } +} + +class _MangaChapterPageGalleryState + extends ConsumerState + with TickerProviderStateMixin { + late AnimationController _scaleAnimationController; + late Animation _animation; + late ReaderController _readerController = + ref.read(readerControllerProvider(chapter: chapter).notifier); + bool isDesktop = Platform.isMacOS || Platform.isLinux || Platform.isWindows; + + @override + void dispose() { + _readerController.setMangaHistoryUpdate(); + _readerController.checkAndSyncProgress(); + _readerController.setPageIndex( + _geCurrentIndex(_uChapDataPreload[_currentIndex!].index!), true); + _rebuildDetail.close(); + _doubleClickAnimationController.dispose(); + _autoScroll.value = false; + clearGestureDetailsCache(); + if (isDesktop) { + setFullScreen(value: false); + } else { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, + overlays: SystemUiOverlay.values); + } + super.dispose(); + } + + late final _autoScroll = + ValueNotifier(_readerController.autoScrollValues().$1); + late final _autoScrollPage = ValueNotifier(_autoScroll.value); + late GetChapterPagesModel _chapterUrlModel = widget.chapterUrlModel; + + late Chapter chapter = widget.chapter; + + List _uChapDataPreload = []; + + final _failedToLoadImage = ValueNotifier(false); + + late int? _currentIndex = _readerController.getPageIndex(); + + late final ItemScrollController _itemScrollController = + ItemScrollController(); + final ScrollOffsetController _pageOffsetController = ScrollOffsetController(); + final ItemPositionsListener _itemPositionsListener = + ItemPositionsListener.create(); + + late AnimationController _doubleClickAnimationController; + + Animation? _doubleClickAnimation; + late DoubleClickAnimationListener _doubleClickAnimationListener; + List doubleTapScales = [1.0, 2.0]; + final StreamController _rebuildDetail = + StreamController.broadcast(); + @override + void initState() { + _doubleClickAnimationController = AnimationController( + duration: _doubleTapAnimationDuration(), vsync: this); + _scaleAnimationController = AnimationController( + duration: _doubleTapAnimationDuration(), vsync: this); + _animation = Tween(begin: 1.0, end: 2.0).animate( + CurvedAnimation(curve: Curves.ease, parent: _scaleAnimationController)); + _animation.addListener(() => _photoViewController.scale = _animation.value); + _itemPositionsListener.itemPositions.addListener(_readProgressListener); + _initCurrentIndex(); + + super.initState(); + } + + final double _horizontalScaleValue = 1.0; + + late int pagePreloadAmount = ref.watch(pagePreloadAmountStateProvider); + late bool _isBookmarked = _readerController.getChapterBookmarked(); + + final _currentReaderMode = StateProvider((ref) => null); + PageMode? _pageMode; + bool _isView = false; + Alignment _scalePosition = Alignment.center; + final PhotoViewController _photoViewController = PhotoViewController(); + final PhotoViewScaleStateController _photoViewScaleStateController = + PhotoViewScaleStateController(); + final List _cropBorderCheckList = []; + + void _onScaleEnd(BuildContext context, ScaleEndDetails details, + PhotoViewControllerValue controllerValue) { + if (controllerValue.scale! < 1) { + _photoViewScaleStateController.reset(); + } + } + + late final _extendedController = + ExtendedPageController(initialPage: _currentIndex!); + + double get pixelRatio => View.of(context).devicePixelRatio; + + Size get size => View.of(context).physicalSize / pixelRatio; + Alignment _computeAlignmentByTapOffset(Offset offset) { + return Alignment((offset.dx - size.width / 2) / (size.width / 2), + (offset.dy - size.height / 2) / (size.height / 2)); + } + + Axis _scrollDirection = Axis.vertical; + bool _isReverseHorizontal = false; + + late final _showPagesNumber = + StateProvider((ref) => _readerController.getShowPageNumber()); + + Color _backgroundColor(BuildContext context) => + Theme.of(context).scaffoldBackgroundColor.withOpacity(0.9); + + void _setFullScreen({bool? value}) async { + if (isDesktop) { + value = await windowManager.isFullScreen(); + setFullScreen(value: !value); + } + ref.read(fullScreenReaderStateProvider.notifier).set(!value!); + } + + void _onLongPressImageDialog( + UChapDataPreload datas, BuildContext context) async { + Widget button(String label, IconData icon, Function() onPressed) => + Expanded( + child: Padding( + padding: const EdgeInsets.all(15), + child: ElevatedButton( + style: ElevatedButton.styleFrom( + backgroundColor: Colors.transparent, + elevation: 0, + shadowColor: Colors.transparent), + onPressed: onPressed, + child: Column( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Padding( + padding: const EdgeInsets.all(4), + child: Icon(icon), + ), + Text(label) + ], + )), + ), + ); + final imageBytes = await datas.getImageBytes; + if (imageBytes != null && context.mounted) { + final name = + "${widget.chapter.manga.value!.name} ${widget.chapter.name} - ${datas.pageIndex}" + .replaceAll(RegExp(r'[^a-zA-Z0-9 .()\-\s]'), '_'); + showModalBottomSheet( + context: context, + constraints: BoxConstraints( + maxWidth: context.width(1), + ), + builder: (context) { + return ListView( + shrinkWrap: true, + children: [ + Container( + decoration: BoxDecoration( + borderRadius: const BorderRadius.only( + topLeft: Radius.circular(20), + topRight: Radius.circular(20)), + color: context.themeData.scaffoldBackgroundColor), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: Container( + height: 7, + width: 35, + decoration: BoxDecoration( + borderRadius: BorderRadius.circular(6), + color: context.secondaryColor.withOpacity(0.4)), + ), + ), + Row( + children: [ + button(context.l10n.set_as_cover, Icons.image_outlined, + () async { + final res = await showDialog( + context: context, + builder: (context) { + return AlertDialog( + content: + Text(context.l10n.use_this_as_cover_art), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () { + Navigator.pop(context); + }, + child: Text(context.l10n.cancel)), + const SizedBox( + width: 15, + ), + TextButton( + onPressed: () { + final manga = + widget.chapter.manga.value!; + isar.writeTxnSync(() { + isar.mangas.putSync(manga + ..customCoverImage = + imageBytes); + }); + if (mounted) { + Navigator.pop(context, "ok"); + } + }, + child: Text(context.l10n.ok)), + ], + ) + ], + ); + }); + if (res != null && res == "ok" && context.mounted) { + Navigator.pop(context); + botToast(context.l10n.cover_updated, second: 3); + } + }), + button(context.l10n.share, Icons.share_outlined, + () async { + await Share.shareXFiles([ + XFile.fromData(imageBytes, + name: name, mimeType: 'image/png') + ]); + }), + button(context.l10n.save, Icons.save_outlined, + () async { + final dir = + await StorageProvider().getGalleryDirectory(); + final file = File("${dir!.path}/$name.png"); + file.writeAsBytesSync(imageBytes); + if (context.mounted) { + botToast(context.l10n.picture_saved, second: 3); + } + }), + ], + ), + ], + ), + ), + ], + ); + }, + ); + } + } + + @override + Widget build(BuildContext context) { + final backgroundColor = ref.watch(backgroundColorStateProvider); + final fullScreenReader = ref.watch(fullScreenReaderStateProvider); + final cropBorders = ref.watch(cropBordersStateProvider); + final bool isHorizontalContinuaous = + ref.watch(_currentReaderMode) == ReaderMode.horizontalContinuous; + if (cropBorders) { + _processCropBorders(); + } + final usePageTapZones = ref.watch(usePageTapZonesStateProvider); + final l10n = l10nLocalizations(context)!; + return KeyboardListener( + autofocus: true, + focusNode: FocusNode(), + onKeyEvent: (event) { + bool isLogicalKeyPressed(LogicalKeyboardKey key) => + HardwareKeyboard.instance.isLogicalKeyPressed(key); + bool hasNextChapter = _readerController.getChapterIndex().$1 != 0; + bool hasPrevChapter = _readerController.getChapterIndex().$1 + 1 != + _readerController + .getChaptersLength(_readerController.getChapterIndex().$2); + final action = switch (event.logicalKey) { + LogicalKeyboardKey.f11 => + (!isLogicalKeyPressed(LogicalKeyboardKey.f11)) + ? _setFullScreen() + : null, + LogicalKeyboardKey.escape => + (!isLogicalKeyPressed(LogicalKeyboardKey.escape)) + ? _goBack(context) + : null, + LogicalKeyboardKey.backspace => + (!isLogicalKeyPressed(LogicalKeyboardKey.backspace)) + ? _goBack(context) + : null, + LogicalKeyboardKey.arrowUp => + (!isLogicalKeyPressed(LogicalKeyboardKey.arrowUp)) + ? _onBtnTapped(_currentIndex! - 1, true) + : null, + LogicalKeyboardKey.arrowLeft => + (!isLogicalKeyPressed(LogicalKeyboardKey.arrowLeft)) + ? _isReverseHorizontal + ? _onBtnTapped(_currentIndex! + 1, false) + : _onBtnTapped(_currentIndex! - 1, true) + : null, + LogicalKeyboardKey.arrowRight => + (!isLogicalKeyPressed(LogicalKeyboardKey.arrowRight)) + ? _isReverseHorizontal + ? _onBtnTapped(_currentIndex! - 1, true) + : _onBtnTapped(_currentIndex! + 1, false) + : null, + LogicalKeyboardKey.arrowDown => + (!isLogicalKeyPressed(LogicalKeyboardKey.arrowDown)) + ? _onBtnTapped(_currentIndex! + 1, true) + : null, + LogicalKeyboardKey.keyN || + LogicalKeyboardKey.pageDown => + ((!isLogicalKeyPressed(LogicalKeyboardKey.keyN) || + !isLogicalKeyPressed(LogicalKeyboardKey.pageDown))) + ? switch (hasNextChapter) { + true => pushReplacementMangaReaderView( + context: context, + chapter: _readerController.getNextChapter(), + ), + _ => null + } + : null, + LogicalKeyboardKey.keyP || + LogicalKeyboardKey.pageUp => + ((!isLogicalKeyPressed(LogicalKeyboardKey.keyP) || + !isLogicalKeyPressed(LogicalKeyboardKey.pageUp))) + ? switch (hasPrevChapter) { + true => pushReplacementMangaReaderView( + context: context, + chapter: _readerController.getPrevChapter()), + _ => null + } + : null, + _ => null + }; + action; + }, + child: NotificationListener( + onNotification: (notification) { + if (notification.direction == ScrollDirection.idle) { + if (_isView) { + _isViewFunction(); + } + } + + return true; + }, + child: Material( + child: SafeArea( + top: !fullScreenReader, + bottom: false, + child: ValueListenableBuilder( + valueListenable: _failedToLoadImage, + builder: (context, failedToLoadImage, child) { + return Stack( + children: [ + _isVerticalOrHorizontalContinous() + ? PhotoViewGallery.builder( + itemCount: 1, + builder: (_, __) => + PhotoViewGalleryPageOptions.customChild( + controller: _photoViewController, + scaleStateController: + _photoViewScaleStateController, + basePosition: _scalePosition, + onScaleEnd: _onScaleEnd, + child: ScrollablePositionedList.separated( + scrollDirection: isHorizontalContinuaous + ? Axis.horizontal + : Axis.vertical, + minCacheExtent: pagePreloadAmount * + context.height(1), + initialScrollIndex: + _readerController.getPageIndex(), + itemCount: + (_pageMode == PageMode.doublePage && + !isHorizontalContinuaous) + ? (_uChapDataPreload.length / 2) + .ceil() + + 1 + : _uChapDataPreload.length, + physics: const ClampingScrollPhysics(), + itemScrollController: + _itemScrollController, + scrollOffsetController: + _pageOffsetController, + itemPositionsListener: + _itemPositionsListener, + itemBuilder: (context, index) { + int index1 = index * 2 - 1; + int index2 = index1 + 1; + return GestureDetector( + behavior: + HitTestBehavior.translucent, + onDoubleTapDown: (details) { + _toggleScale( + details.globalPosition); + }, + onDoubleTap: () {}, + child: (_pageMode == + PageMode.doublePage && + !isHorizontalContinuaous) + ? DoubleColummVerticalView( + datas: index == 0 + ? [ + _uChapDataPreload[ + 0], + null + ] + : [ + index1 < + _uChapDataPreload + .length + ? _uChapDataPreload[ + index1] + : null, + index2 < + _uChapDataPreload + .length + ? _uChapDataPreload[ + index2] + : null, + ], + backgroundColor: + backgroundColor, + isFailedToLoadImage: + (val) {}, + onLongPressData: (datas) { + _onLongPressImageDialog( + datas, context); + }, + ) + : ImageViewVertical( + data: _uChapDataPreload[ + index], + failedToLoadImage: (value) { + // _failedToLoadImage.value = value; + }, + onLongPressData: (datas) { + _onLongPressImageDialog( + datas, context); + }, + isHorizontal: ref.watch( + _currentReaderMode) == + ReaderMode + .horizontalContinuous, + ), + ); + }, + separatorBuilder: (_, __) => ref.watch( + _currentReaderMode) == + ReaderMode.webtoon + ? const SizedBox.shrink() + : ref.watch(_currentReaderMode) == + ReaderMode + .horizontalContinuous + ? VerticalDivider( + color: getBackgroundColor( + backgroundColor), + width: 6) + : Divider( + color: getBackgroundColor( + backgroundColor), + height: 6), + )), + ) + : Material( + color: getBackgroundColor(backgroundColor), + shadowColor: getBackgroundColor(backgroundColor), + child: (_pageMode == PageMode.doublePage && + !isHorizontalContinuaous) + ? ExtendedImageGesturePageView.builder( + controller: _extendedController, + scrollDirection: _scrollDirection, + reverse: _isReverseHorizontal, + physics: const ClampingScrollPhysics(), + canScrollPage: (_) { + return _horizontalScaleValue == 1.0; + }, + itemBuilder: (context, index) { + int index1 = index * 2 - 1; + int index2 = index1 + 1; + final pageList = (index == 0 + ? [_uChapDataPreload[0], null] + : [ + index1 < + _uChapDataPreload.length + ? _uChapDataPreload[index1] + : null, + index2 < + _uChapDataPreload.length + ? _uChapDataPreload[index2] + : null, + ]); + return DoubleColummView( + datas: _isReverseHorizontal + ? pageList.reversed.toList() + : pageList, + backgroundColor: backgroundColor, + isFailedToLoadImage: (val) { + if (_failedToLoadImage.value != + val && + mounted) { + _failedToLoadImage.value = val; + } + }, + onLongPressData: (datas) { + _onLongPressImageDialog( + datas, context); + }, + ); + }, + itemCount: (_uChapDataPreload.length / 2) + .ceil() + + 1, + onPageChanged: _onPageChanged) + : ExtendedImageGesturePageView.builder( + controller: _extendedController, + scrollDirection: _scrollDirection, + reverse: _isReverseHorizontal, + physics: const ClampingScrollPhysics(), + canScrollPage: (gestureDetails) { + return gestureDetails != null + ? !(gestureDetails.totalScale! > + 1.0) + : true; + }, + itemBuilder: + (BuildContext context, int index) { + return ImageViewPaged( + data: _uChapDataPreload[index], + loadStateChanged: (state) { + if (state.extendedImageLoadState == + LoadState.loading) { + final ImageChunkEvent? + loadingProgress = + state.loadingProgress; + final double progress = loadingProgress + ?.expectedTotalBytes != + null + ? loadingProgress! + .cumulativeBytesLoaded / + loadingProgress + .expectedTotalBytes! + : 0; + return Container( + color: getBackgroundColor( + backgroundColor), + height: context.height(0.8), + child: + CircularProgressIndicatorAnimateRotate( + progress: progress), + ); + } + if (state.extendedImageLoadState == + LoadState.completed) { + if (_failedToLoadImage.value == + true) { + Future.delayed(const Duration( + milliseconds: 10)) + .then((value) => + _failedToLoadImage + .value = false); + } + return ExtendedImageGesture( + state, + canScaleImage: (_) => true, + imageBuilder: (Widget image, + {ExtendedImageGestureState? + imageGestureState}) { + return image; + }, + ); + } + if (state.extendedImageLoadState == + LoadState.failed) { + if (_failedToLoadImage.value == + false) { + Future.delayed(const Duration( + milliseconds: 10)) + .then((value) => + _failedToLoadImage + .value = true); + } + return Container( + color: getBackgroundColor( + backgroundColor), + height: context.height(0.8), + child: Column( + mainAxisAlignment: + MainAxisAlignment + .center, + children: [ + Text( + l10n.image_loading_error, + style: TextStyle( + color: Colors.white + .withOpacity( + 0.7)), + ), + Padding( + padding: + const EdgeInsets + .all(8.0), + child: GestureDetector( + onLongPress: () { + state + .reLoadImage(); + _failedToLoadImage + .value = + false; + }, + onTap: () { + state + .reLoadImage(); + _failedToLoadImage + .value = + false; + }, + child: Container( + decoration: BoxDecoration( + color: context + .primaryColor, + borderRadius: + BorderRadius + .circular( + 30)), + child: Padding( + padding: const EdgeInsets + .symmetric( + vertical: 8, + horizontal: + 16), + child: Text( + l10n.retry, + ), + ), + )), + ), + ], + )); + } + return const SizedBox.shrink(); + }, + initGestureConfigHandler: (state) { + return GestureConfig( + inertialSpeed: 200, + inPageView: true, + maxScale: 8, + animationMaxScale: 8, + cacheGesture: true, + hitTestBehavior: + HitTestBehavior.translucent, + ); + }, + onDoubleTap: (state) { + final Offset? pointerDownPosition = + state.pointerDownPosition; + final double? begin = state + .gestureDetails!.totalScale; + double end; + + //remove old + _doubleClickAnimation?.removeListener( + _doubleClickAnimationListener); + + //stop pre + _doubleClickAnimationController + .stop(); + + //reset to use + _doubleClickAnimationController + .reset(); + + if (begin == doubleTapScales[0]) { + end = doubleTapScales[1]; + } else { + end = doubleTapScales[0]; + } + + _doubleClickAnimationListener = () { + state.handleDoubleTap( + scale: _doubleClickAnimation! + .value, + doubleTapPosition: + pointerDownPosition); + }; + + _doubleClickAnimation = Tween( + begin: begin, end: end) + .animate(CurvedAnimation( + curve: Curves.ease, + parent: + _doubleClickAnimationController)); + + _doubleClickAnimation!.addListener( + _doubleClickAnimationListener); + + _doubleClickAnimationController + .forward(); + }, + onLongPressData: (datas) { + _onLongPressImageDialog( + datas, context); + }, + ); + }, + itemCount: _uChapDataPreload.length, + onPageChanged: _onPageChanged)), + _gestureRightLeft(failedToLoadImage, usePageTapZones), + _gestureTopBottom(failedToLoadImage, usePageTapZones), + _appBar(), + _bottomBar(), + _showPage(), + _autoScrollPlayPauseBtn() + ], + ); + }), + ), + ), + ), + ); + } + + void _precacheImages(int index) { + try { + if (0 <= index && index < _uChapDataPreload.length) { + if (!_uChapDataPreload[index].isLocale!) { + precacheImage( + ExtendedNetworkImageProvider( + _uChapDataPreload[index].pageUrl!.url, + cache: true, + cacheMaxAge: const Duration(days: 7), + headers: { + ..._uChapDataPreload[index].pageUrl!.headers ?? {}, + ...ref.watch(headersProvider( + source: chapter.manga.value!.source!, + lang: chapter.manga.value!.lang!)) + }, + ), + context); + } else { + final archiveImage = (_uChapDataPreload[index].archiveImage); + + if (archiveImage != null) { + precacheImage( + ExtendedMemoryImageProvider( + (_uChapDataPreload[index].archiveImage)!), + context); + } else { + precacheImage( + ExtendedFileImageProvider(File( + "${_uChapDataPreload[index].directory!.path}${padIndex(_uChapDataPreload[index].index! + 1)}.jpg")), + context); + } + } + } + } catch (_) {} + } + + Duration? _doubleTapAnimationDuration() { + int doubleTapAnimationValue = + isar.settings.getSync(227)!.doubleTapAnimationSpeed!; + if (doubleTapAnimationValue == 0) { + return const Duration(milliseconds: 10); + } else if (doubleTapAnimationValue == 1) { + return const Duration(milliseconds: 800); + } + return const Duration(milliseconds: 200); + } + + void _readProgressListener() { + _currentIndex = _itemPositionsListener.itemPositions.value.first.index; + + int pagesLength = (_pageMode == PageMode.doublePage && + !(ref.watch(_currentReaderMode) == ReaderMode.horizontalContinuous)) + ? (_uChapDataPreload.length / 2).ceil() + 1 + : _uChapDataPreload.length; + + if (_currentIndex! >= 0 && _currentIndex! < pagesLength) { + if (_readerController.chapter.id != + _uChapDataPreload[_currentIndex!].chapter!.id) { + _readerController.setPageIndex( + _geCurrentIndex(_uChapDataPreload[_currentIndex! - 1].index!), + false); + if (mounted) { + setState(() { + _readerController = ref.read(readerControllerProvider( + chapter: _uChapDataPreload[_currentIndex!].chapter!) + .notifier); + + chapter = _uChapDataPreload[_currentIndex!].chapter!; + _chapterUrlModel = + _uChapDataPreload[_currentIndex!].chapterUrlModel!; + _isBookmarked = _readerController.getChapterBookmarked(); + }); + } + } + if (_itemPositionsListener.itemPositions.value.last.index == + pagesLength - 1) { + try { + ref + .watch(getChapterPagesProvider( + chapter: _readerController.getNextChapter(), + ).future) + .then((value) => _preloadNextChapter(value, chapter)); + } catch (_) {} + } + + ref.read(currentIndexProvider(chapter).notifier).setCurrentIndex( + _uChapDataPreload[_currentIndex!].index!, + ); + } + } + + void _preloadNextChapter(GetChapterPagesModel chapterData, Chapter chap) { + try { + int length = 0; + bool isExist = false; + List uChapDataPreloadP = []; + List uChapDataPreloadL = _uChapDataPreload; + List preChap = []; + final uIsNotEmpty = + chapterData.uChapDataPreload.first.chapter!.url!.isNotEmpty; + final aIsNotEmpty = + chapterData.uChapDataPreload.first.chapter!.archivePath!.isNotEmpty; + for (var chp in _uChapDataPreload) { + final cuIsNotEmpty = chp.chapter!.url!.isNotEmpty; + final caIsNotEmpty = chp.chapter!.archivePath!.isNotEmpty; + if (uIsNotEmpty && + cuIsNotEmpty && + chapterData.uChapDataPreload.first.chapter!.url == + chp.chapter!.url || + aIsNotEmpty && + caIsNotEmpty && + chapterData.uChapDataPreload.first.chapter!.archivePath == + chp.chapter!.archivePath) { + isExist = true; + } + } + if (!isExist) { + for (var ch in chapterData.uChapDataPreload) { + preChap.add(ch); + } + } + + if (preChap.isNotEmpty) { + length = _uChapDataPreload.length; + for (var i = 0; i < preChap.length; i++) { + int index = i + length; + final dataPreload = preChap[i]; + uChapDataPreloadP.add(dataPreload..pageIndex = index); + } + if (mounted) { + uChapDataPreloadL.addAll(uChapDataPreloadP); + if (mounted) { + setState(() { + _uChapDataPreload = uChapDataPreloadL; + }); + } + } + } + } catch (_) {} + } + + void _initCurrentIndex() async { + final readerMode = _readerController.getReaderMode(); + _uChapDataPreload.addAll(_chapterUrlModel.uChapDataPreload); + _readerController.setMangaHistoryUpdate(); + await Future.delayed(const Duration(milliseconds: 1)); + final fullScreenReader = ref.watch(fullScreenReaderStateProvider); + if (fullScreenReader) { + if (isDesktop) { + setFullScreen(value: true); + } else { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); + } + } + ref.read(_currentReaderMode.notifier).state = readerMode; + if (mounted) { + setState(() { + _pageMode = _readerController.getPageMode(); + }); + } + _setReaderMode(readerMode, ref); + ref.read(currentIndexProvider(chapter).notifier).setCurrentIndex( + _uChapDataPreload[_currentIndex!].index!, + ); + if (!(_isVerticalOrHorizontalContinous())) { + for (var i = 1; i < pagePreloadAmount + 1; i++) { + _precacheImages(_currentIndex! + i); + _precacheImages(_currentIndex! - i); + } + } + if (readerMode != ReaderMode.verticalContinuous && + readerMode != ReaderMode.webtoon) { + _autoScroll.value = false; + } + _autoPagescroll(); + if (_readerController.getPageLength(_chapterUrlModel.pageUrls) == 1 && + (readerMode == ReaderMode.ltr || + readerMode == ReaderMode.rtl || + readerMode == ReaderMode.vertical)) { + _onPageChanged(0); + } + } + + void _onPageChanged(int index) { + final cropBorders = ref.watch(cropBordersStateProvider); + if (cropBorders) { + _processCropBordersByIndex(index); + } + for (var i = 1; i < pagePreloadAmount + 1; i++) { + _precacheImages(index + i); + _precacheImages(index - i); + } + + if (_readerController.chapter.id != _uChapDataPreload[index].chapter!.id) { + _readerController.setPageIndex( + _geCurrentIndex(_uChapDataPreload[_currentIndex!].index!), false); + if (mounted) { + setState(() { + _readerController = ref.read(readerControllerProvider( + chapter: _uChapDataPreload[_currentIndex!].chapter!) + .notifier); + chapter = _uChapDataPreload[_currentIndex!].chapter!; + _chapterUrlModel = _uChapDataPreload[index].chapterUrlModel!; + _isBookmarked = _readerController.getChapterBookmarked(); + }); + } + } + _currentIndex = index; + + ref + .read(currentIndexProvider(chapter).notifier) + .setCurrentIndex(_uChapDataPreload[index].index!); + + if (_uChapDataPreload[index].pageIndex! == _uChapDataPreload.length - 1) { + try { + ref + .watch(getChapterPagesProvider( + chapter: _readerController.getNextChapter(), + ).future) + .then((value) => _preloadNextChapter(value, chapter)); + } catch (_) {} + } + } + + late final _pageOffset = + ValueNotifier(_readerController.autoScrollValues().$2); + + void _autoPagescroll() async { + if (_isVerticalOrHorizontalContinous()) { + for (int i = 0; i < 1; i++) { + await Future.delayed(const Duration(milliseconds: 100)); + if (!_autoScroll.value) { + return; + } + _pageOffsetController.animateScroll( + offset: _pageOffset.value, + duration: const Duration(milliseconds: 100)); + } + _autoPagescroll(); + } + } + + void _onBtnTapped(int index, bool isPrev, {bool isSlide = false}) { + if (_isView && !isSlide) { + _isViewFunction(); + } + final readerMode = ref.watch(_currentReaderMode); + final animatePageTransitions = + ref.watch(animatePageTransitionsStateProvider); + if (isPrev) { + if (readerMode == ReaderMode.verticalContinuous || + readerMode == ReaderMode.webtoon || + readerMode == ReaderMode.horizontalContinuous) { + if (index != -1) { + if (isSlide) { + _itemScrollController.jumpTo( + index: index, + ); + } else { + animatePageTransitions + ? _itemScrollController.scrollTo( + curve: Curves.ease, + index: index, + duration: const Duration(milliseconds: 150)) + : _itemScrollController.jumpTo( + index: index, + ); + } + } + } else { + if (index != -1) { + if (_extendedController.hasClients) { + if (isSlide) { + _extendedController.jumpToPage(index); + } else { + animatePageTransitions + ? _extendedController.animateToPage(index, + duration: const Duration(milliseconds: 150), + curve: Curves.ease) + : _extendedController.jumpToPage(index); + } + } + } + } + } else { + if (readerMode == ReaderMode.verticalContinuous || + readerMode == ReaderMode.webtoon || + readerMode == ReaderMode.horizontalContinuous) { + if (isSlide) { + _itemScrollController.jumpTo( + index: index, + ); + } else { + animatePageTransitions + ? _itemScrollController.scrollTo( + curve: Curves.ease, + index: index, + duration: const Duration(milliseconds: 150)) + : _itemScrollController.jumpTo( + index: index, + ); + } + } else { + if (_extendedController.hasClients) { + if (isSlide) { + _itemScrollController.jumpTo( + index: index, + ); + } else { + animatePageTransitions + ? _extendedController.animateToPage(index, + duration: const Duration(milliseconds: 150), + curve: Curves.ease) + : _extendedController.jumpToPage(index); + } + } + } + } + } + + void _toggleScale(Offset tapPosition) { + if (mounted) { + setState(() { + if (_scaleAnimationController.isAnimating) { + return; + } + + if (_photoViewController.scale == 1.0) { + _scalePosition = _computeAlignmentByTapOffset(tapPosition); + + if (_scaleAnimationController.isCompleted) { + _scaleAnimationController.reset(); + } + + _scaleAnimationController.forward(); + return; + } + + if (_photoViewController.scale == 2.0) { + _scaleAnimationController.reverse(); + return; + } + + _photoViewScaleStateController.reset(); + }); + } + } + + void _setReaderMode(ReaderMode value, WidgetRef ref) async { + if (value != ReaderMode.verticalContinuous && value != ReaderMode.webtoon) { + _autoScroll.value = false; + } else { + if (_autoScrollPage.value) { + _autoPagescroll(); + _autoScroll.value = true; + } + } + + _failedToLoadImage.value = false; + _readerController.setReaderMode(value); + + int index = (_pageMode == PageMode.doublePage && + !(ref.watch(_currentReaderMode) == ReaderMode.horizontalContinuous)) + ? (_currentIndex! / 2).ceil() + : _currentIndex!; + ref.read(_currentReaderMode.notifier).state = value; + if (value == ReaderMode.vertical) { + if (mounted) { + setState(() { + _scrollDirection = Axis.vertical; + _isReverseHorizontal = false; + }); + await Future.delayed(const Duration(milliseconds: 30)); + + _extendedController.jumpToPage(index); + } + } else if (value == ReaderMode.ltr || value == ReaderMode.rtl) { + if (mounted) { + setState(() { + if (value == ReaderMode.rtl) { + _isReverseHorizontal = true; + } else { + _isReverseHorizontal = false; + } + + _scrollDirection = Axis.horizontal; + }); + await Future.delayed(const Duration(milliseconds: 30)); + + _extendedController.jumpToPage(index); + } + } else { + if (mounted) { + setState(() { + _isReverseHorizontal = false; + }); + await Future.delayed(const Duration(milliseconds: 30)); + _itemScrollController.scrollTo( + index: index, + duration: const Duration(milliseconds: 1), + curve: Curves.ease); + } + } + } + + void _processCropBordersByIndex(int index) async { + if (!_cropBorderCheckList.contains(index)) { + _cropBorderCheckList.add(index); + ref + .watch(cropBordersProvider( + data: _uChapDataPreload[index], cropBorder: true) + .future) + .then((value) { + _uChapDataPreload[index] = _uChapDataPreload[index]..cropImage = value; + }); + if (mounted) { + setState(() {}); + } + } + } + + void _processCropBorders() async { + for (var i = 0; i < _uChapDataPreload.length; i++) { + if (!_cropBorderCheckList.contains(i)) { + _cropBorderCheckList.add(i); + ref + .watch(cropBordersProvider( + data: _uChapDataPreload[i], cropBorder: true) + .future) + .then((value) { + _uChapDataPreload[i] = _uChapDataPreload[i]..cropImage = value; + if (mounted) { + setState(() {}); + } + }); + } + } + } + + void _goBack(BuildContext context) { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, + overlays: SystemUiOverlay.values); + Navigator.pop(context); + } + + Widget _appBar() { + if (!_isView && Platform.isIOS) { + return const SizedBox.shrink(); + } + final fullScreenReader = ref.watch(fullScreenReaderStateProvider); + double height = _isView + ? Platform.isIOS + ? 120 + : !fullScreenReader && !isDesktop + ? 55 + : 80 + : 0; + return Positioned( + top: 0, + child: AnimatedContainer( + width: context.width(1), + height: height, + curve: Curves.ease, + duration: const Duration(milliseconds: 200), + child: PreferredSize( + preferredSize: Size.fromHeight(height), + child: AppBar( + centerTitle: false, + automaticallyImplyLeading: false, + titleSpacing: 0, + leading: BackButton( + onPressed: () { + Navigator.pop(context); + }, + ), + title: ListTile( + dense: true, + title: SizedBox( + width: context.width(0.8), + child: Text( + '${_readerController.getMangaName()} ', + style: const TextStyle(fontWeight: FontWeight.bold), + overflow: TextOverflow.ellipsis, + ), + ), + subtitle: SizedBox( + width: context.width(0.8), + child: Text( + _readerController.getChapterTitle(), + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.w400, + ), + overflow: TextOverflow.ellipsis, + ), + ), + ), + actions: [ + btnToShowChapterListDialog( + context, context.l10n.chapters, widget.chapter), + IconButton( + onPressed: () { + _readerController.setChapterBookmarked(); + setState(() { + _isBookmarked = !_isBookmarked; + }); + }, + icon: Icon(_isBookmarked + ? Icons.bookmark + : Icons.bookmark_border_outlined)), + if ((chapter.manga.value!.isLocalArchive ?? false) == false) + IconButton( + onPressed: () async { + final manga = chapter.manga.value!; + final source = getSource(manga.lang!, manga.source!)!; + String url = chapter.url!.startsWith('/') + ? "${source.baseUrl}/${chapter.url!}" + : chapter.url!; + Map data = { + 'url': url, + 'sourceId': source.id.toString(), + 'title': chapter.name! + }; + if (Platform.isLinux) { + final urll = Uri.parse(url); + if (!await launchUrl( + urll, + mode: LaunchMode.inAppBrowserView, + )) { + if (!await launchUrl( + urll, + mode: LaunchMode.externalApplication, + )) { + throw 'Could not launch $url'; + } + } + } else { + context.push("/mangawebview", extra: data); + } + }, + icon: const Icon(Icons.public)), + ], + backgroundColor: _backgroundColor(context), + ), + ), + ), + ); + } + + Widget _autoScrollPlayPauseBtn() { + return _isVerticalOrHorizontalContinous() + ? Positioned( + bottom: 0, + right: 0, + child: !_isView + ? ValueListenableBuilder( + valueListenable: _autoScrollPage, + builder: (context, valueT, child) => valueT + ? ValueListenableBuilder( + valueListenable: _autoScroll, + builder: (context, value, child) => IconButton( + onPressed: () { + _autoPagescroll(); + _autoScroll.value = !value; + }, + icon: Icon(value + ? Icons.pause_circle + : Icons.play_circle)), + ) + : const SizedBox.shrink(), + ) + : const SizedBox.shrink()) + : const SizedBox.shrink(); + } + + Widget _bottomBar() { + if (!_isView && Platform.isIOS) { + return const SizedBox.shrink(); + } + bool hasPrevChapter = _readerController.getChapterIndex().$1 + 1 != + _readerController + .getChaptersLength(_readerController.getChapterIndex().$2); + bool hasNextChapter = _readerController.getChapterIndex().$1 != 0; + final readerMode = ref.watch(_currentReaderMode); + + return Positioned( + bottom: 0, + child: AnimatedContainer( + curve: Curves.ease, + duration: const Duration(milliseconds: 300), + width: context.width(1), + height: (_isView ? 130 : 0), + child: Column( + children: [ + Flexible( + child: Transform.scale( + scaleX: !_isReverseHorizontal ? 1 : -1, + child: Row( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: CircleAvatar( + radius: 23, + backgroundColor: _backgroundColor(context), + child: IconButton( + onPressed: hasPrevChapter + ? () { + pushReplacementMangaReaderView( + context: context, + chapter: + _readerController.getPrevChapter()); + } + : null, + icon: Transform.scale( + scaleX: 1, + child: Icon(Icons.skip_previous_rounded, + color: hasPrevChapter + ? Theme.of(context) + .textTheme + .bodyLarge! + .color + : Theme.of(context) + .textTheme + .bodyLarge! + .color! + .withOpacity(0.4)), + )), + ), + ), + Flexible( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: Container( + height: 70, + decoration: BoxDecoration( + color: _backgroundColor(context), + borderRadius: BorderRadius.circular(25)), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Transform.scale( + scaleX: !_isReverseHorizontal ? 1 : -1, + child: SizedBox( + width: 55, + child: Center( + child: Consumer( + builder: (context, ref, child) { + final currentIndex = ref + .watch(currentIndexProvider(chapter)); + return Text( + _currentIndexLabel(currentIndex), + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ); + }), + ), + ), + ), + if (_isView) + Flexible( + flex: 14, + child: + Consumer(builder: (context, ref, child) { + final currentIndex = ref + .watch(currentIndexProvider(chapter)); + return SliderTheme( + data: SliderTheme.of(context).copyWith( + overlayShape: + const RoundSliderOverlayShape( + overlayRadius: 5.0), + ), + child: Slider( + onChanged: (value) { + ref + .read( + currentIndexProvider(chapter) + .notifier) + .setCurrentIndex(value.toInt()); + }, + onChangeEnd: (newValue) { + try { + final index = _uChapDataPreload + .firstWhere((element) => + element.chapter == + chapter && + element.index == + newValue.toInt()) + .pageIndex; + + _onBtnTapped( + index!, + true, + isSlide: true, + ); + } catch (_) {} + }, + divisions: _readerController + .getPageLength( + _chapterUrlModel + .pageUrls) == + 1 + ? null + : _pageMode == PageMode.doublePage + ? ((_readerController.getPageLength( + _chapterUrlModel + .pageUrls)) / + 2) + .ceil() + + 1 + : _readerController + .getPageLength( + _chapterUrlModel + .pageUrls) - + 1, + value: min( + (currentIndex).toDouble(), + (_pageMode == PageMode.doublePage && + !(ref.watch( + _currentReaderMode) == + ReaderMode + .horizontalContinuous)) + ? ((_readerController.getPageLength( + _chapterUrlModel + .pageUrls)) / + 2) + .ceil() + + 1 + : (_readerController + .getPageLength( + _chapterUrlModel + .pageUrls) + .toDouble())), + label: _currentIndexLabel(currentIndex), + min: 0, + max: (_pageMode == + PageMode.doublePage && + !(ref.watch( + _currentReaderMode) == + ReaderMode + .horizontalContinuous)) + ? (((_readerController.getPageLength( + _chapterUrlModel + .pageUrls)) / + 2) + .ceil() + + 1) + .toDouble() + : (_readerController.getPageLength( + _chapterUrlModel + .pageUrls) - + 1) + .toDouble(), + ), + ); + }), + ), + Transform.scale( + scaleX: !_isReverseHorizontal ? 1 : -1, + child: SizedBox( + width: 55, + child: Center( + child: Text( + "${_readerController.getPageLength(_chapterUrlModel.pageUrls)}", + style: const TextStyle( + fontSize: 12, + fontWeight: FontWeight.bold, + ), + ), + ), + ), + ), + ], + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: CircleAvatar( + radius: 23, + backgroundColor: _backgroundColor(context), + child: IconButton( + onPressed: hasNextChapter + ? () { + pushReplacementMangaReaderView( + context: context, + chapter: _readerController.getNextChapter(), + ); + } + : null, + icon: Transform.scale( + scaleX: 1, + child: Icon( + Icons.skip_next_rounded, + color: hasNextChapter + ? Theme.of(context).textTheme.bodyLarge!.color + : Theme.of(context) + .textTheme + .bodyLarge! + .color! + .withOpacity(0.4), + // size: 17, + ), + ), + ), + ), + ), + ], + ), + ), + ), + Flexible( + child: Container( + height: 65, + color: _backgroundColor(context), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + PopupMenuButton( + popUpAnimationStyle: popupAnimationStyle, + color: Colors.black, + child: const Icon( + Icons.app_settings_alt_outlined, + ), + onSelected: (value) { + ref.read(_currentReaderMode.notifier).state = value; + _setReaderMode(value, ref); + }, + itemBuilder: (context) => [ + for (var mode in ReaderMode.values) + PopupMenuItem( + value: mode, + child: Row( + children: [ + Icon( + Icons.check, + color: readerMode == mode + ? Colors.white + : Colors.transparent, + ), + const SizedBox( + width: 7, + ), + Text( + getReaderModeName(mode, context), + style: const TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ], + )), + ], + ), + Consumer(builder: (context, ref, child) { + final cropBorders = ref.watch(cropBordersStateProvider); + return IconButton( + onPressed: () { + ref + .read(cropBordersStateProvider.notifier) + .set(!cropBorders); + }, + icon: Stack( + children: [ + const Icon( + Icons.crop_rounded, + ), + if (!cropBorders) + Positioned( + right: 8, + child: Transform.scale( + scaleX: 2.5, + child: const Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Text( + '\\', + style: TextStyle(fontSize: 17), + ), + ], + ), + ), + ), + ], + ), + ); + }), + IconButton( + onPressed: () async { + if (!(readerMode == ReaderMode.horizontalContinuous)) { + PageMode newPageMode; + + _onBtnTapped( + _pageMode == PageMode.onePage + ? (_geCurrentIndex( + _uChapDataPreload[_currentIndex!] + .index!) / + 2) + .ceil() + : _geCurrentIndex( + _uChapDataPreload[_currentIndex!].index!), + true, + isSlide: true, + ); + newPageMode = _pageMode == PageMode.onePage + ? PageMode.doublePage + : PageMode.onePage; + + _readerController.setPageMode(newPageMode); + if (mounted) { + setState(() { + _pageMode = newPageMode; + }); + } + } + }, + icon: Icon( + _pageMode == PageMode.doublePage + ? CupertinoIcons.book_solid + : CupertinoIcons.book, + ), + ), + IconButton( + onPressed: () { + _showModalSettings(); + }, + icon: const Icon( + Icons.settings_rounded, + ), + ), + ], + ), + ), + ), + ], + ), + ), + ); + } + + Widget _showPage() { + return Consumer(builder: (context, ref, child) { + final currentIndex = ref.watch(currentIndexProvider(chapter)); + return _isView + ? const SizedBox.shrink() + : ref.watch(_showPagesNumber) + ? Align( + alignment: Alignment.bottomCenter, + child: Text( + '${_currentIndexLabel(currentIndex)} / ${_readerController.getPageLength(_chapterUrlModel.pageUrls)}', + style: const TextStyle( + color: Colors.white, + fontSize: 20.0, + shadows: [ + Shadow(offset: Offset(-1, -1), blurRadius: 1), + Shadow(offset: Offset(1, -1), blurRadius: 1), + Shadow(offset: Offset(1, 1), blurRadius: 1), + Shadow(offset: Offset(-1, 1), blurRadius: 1) + ], + ), + textAlign: TextAlign.center, + )) + : const SizedBox.shrink(); + }); + } + + void _isViewFunction() { + final fullScreenReader = ref.watch(fullScreenReaderStateProvider); + if (mounted) { + setState(() { + _isView = !_isView; + }); + } + if (fullScreenReader) { + if (_isView) { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.manual, + overlays: SystemUiOverlay.values); + } else { + SystemChrome.setEnabledSystemUIMode(SystemUiMode.immersive); + } + } + } + + String _currentIndexLabel(int index) { + if (_pageMode != PageMode.doublePage) { + return "${index + 1}"; + } + if (index == 0) { + return "1"; + } + int pageLength = _readerController.getPageLength(_chapterUrlModel.pageUrls); + int index1 = index * 2; + int index2 = index1 + 1; + return !(index * 2 < pageLength) ? "$pageLength" : "$index1-$index2"; + } + + int _geCurrentIndex(int index) { + if (_pageMode != PageMode.doublePage || index == 0) { + return index; + } + int pageLength = _readerController.getPageLength(_chapterUrlModel.pageUrls); + int index1 = index * 2; + return !(index * 2 < pageLength) ? pageLength - 1 : index1 - 1; + } + + Widget _gestureRightLeft(bool failedToLoadImage, bool usePageTapZones) { + return Consumer( + builder: (context, ref, child) { + return Row( + children: [ + /// left region + Expanded( + flex: 2, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + if (usePageTapZones) { + if (_isReverseHorizontal) { + _onBtnTapped(_currentIndex! + 1, false); + } else { + _onBtnTapped(_currentIndex! - 1, true); + } + } else { + _isViewFunction(); + } + }, + onDoubleTapDown: _isVerticalOrHorizontalContinous() + ? (details) { + _toggleScale(details.globalPosition); + } + : null, + onSecondaryTapDown: _isVerticalOrHorizontalContinous() + ? (details) { + _toggleScale(details.globalPosition); + } + : null, + onDoubleTap: _isVerticalOrHorizontalContinous() ? () {} : null, + onSecondaryTap: + _isVerticalOrHorizontalContinous() ? () {} : null, + ), + ), + + /// center region + Expanded( + flex: 2, + child: failedToLoadImage + ? SizedBox( + width: context.width(1), + height: context.height(0.7), + ) + : GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + _isViewFunction(); + }, + onDoubleTapDown: _isVerticalOrHorizontalContinous() + ? (details) { + _toggleScale(details.globalPosition); + } + : null, + onSecondaryTapDown: _isVerticalOrHorizontalContinous() + ? (details) { + _toggleScale(details.globalPosition); + } + : null, + onDoubleTap: + _isVerticalOrHorizontalContinous() ? () {} : null, + onSecondaryTap: + _isVerticalOrHorizontalContinous() ? () {} : null, + ), + ), + + /// right region + Expanded( + flex: 2, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + if (usePageTapZones) { + if (_isReverseHorizontal) { + _onBtnTapped(_currentIndex! - 1, true); + } else { + _onBtnTapped(_currentIndex! + 1, false); + } + } else { + _isViewFunction(); + } + }, + onDoubleTapDown: _isVerticalOrHorizontalContinous() + ? (details) { + _toggleScale(details.globalPosition); + } + : null, + onSecondaryTapDown: _isVerticalOrHorizontalContinous() + ? (details) { + _toggleScale(details.globalPosition); + } + : null, + onDoubleTap: _isVerticalOrHorizontalContinous() ? () {} : null, + onSecondaryTap: + _isVerticalOrHorizontalContinous() ? () {} : null, + ), + ), + ], + ); + }, + ); + } + + Widget _gestureTopBottom(bool failedToLoadImage, bool usePageTapZones) { + return Consumer( + builder: (context, ref, child) { + return Column( + children: [ + /// top region + Expanded( + flex: 2, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + failedToLoadImage + ? _isViewFunction() + : usePageTapZones + ? _onBtnTapped(_currentIndex! - 1, true) + : _isViewFunction(); + }, + onDoubleTapDown: _isVerticalOrHorizontalContinous() + ? (details) { + _toggleScale(details.globalPosition); + } + : null, + onSecondaryTapDown: _isVerticalOrHorizontalContinous() + ? (details) { + _toggleScale(details.globalPosition); + } + : null, + onDoubleTap: _isVerticalOrHorizontalContinous() ? () {} : null, + onSecondaryTap: + _isVerticalOrHorizontalContinous() ? () {} : null, + ), + ), + + /// center region + const Expanded(flex: 5, child: SizedBox.shrink()), + + /// bottom region + Expanded( + flex: 2, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + failedToLoadImage + ? _isViewFunction() + : usePageTapZones + ? _onBtnTapped(_currentIndex! + 1, false) + : _isViewFunction(); + }, + onDoubleTapDown: _isVerticalOrHorizontalContinous() + ? (details) { + _toggleScale(details.globalPosition); + } + : null, + onSecondaryTapDown: _isVerticalOrHorizontalContinous() + ? (details) { + _toggleScale(details.globalPosition); + } + : null, + onDoubleTap: _isVerticalOrHorizontalContinous() ? () {} : null, + onSecondaryTap: + _isVerticalOrHorizontalContinous() ? () {} : null, + ), + ), + ], + ); + }, + ); + } + + bool _isVerticalOrHorizontalContinous() { + final readerMode = ref.watch(_currentReaderMode); + return readerMode == ReaderMode.verticalContinuous || + readerMode == ReaderMode.webtoon || + readerMode == ReaderMode.horizontalContinuous; + } + + void _showModalSettings() async { + _autoScroll.value = false; + final l10n = l10nLocalizations(context)!; + await customDraggableTabBar(tabs: [ + Tab(text: l10n.reading_mode), + Tab(text: l10n.general), + Tab(text: l10n.custom_filter), + ], children: [ + Consumer(builder: (context, ref, chil) { + final readerMode = ref.watch(_currentReaderMode); + final usePageTapZones = ref.watch(usePageTapZonesStateProvider); + final cropBorders = ref.watch(cropBordersStateProvider); + return SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 20), + child: Column( + children: [ + CustomPopupMenuButton( + label: l10n.reading_mode, + title: getReaderModeName(readerMode!, context), + onSelected: (value) { + ref.read(_currentReaderMode.notifier).state = value; + _setReaderMode(value, ref); + }, + value: readerMode, + list: ReaderMode.values, + itemText: (mode) { + return getReaderModeName(mode, context); + }, + ), + SwitchListTile( + value: cropBorders, + title: Text( + l10n.crop_borders, + style: TextStyle( + color: Theme.of(context) + .textTheme + .bodyLarge! + .color! + .withOpacity(0.9), + fontSize: 14), + ), + onChanged: (value) { + ref.read(cropBordersStateProvider.notifier).set(value); + }), + SwitchListTile( + value: usePageTapZones, + title: Text(l10n.use_page_tap_zones, + style: TextStyle( + color: Theme.of(context) + .textTheme + .bodyLarge! + .color! + .withOpacity(0.9), + fontSize: 14)), + onChanged: (value) { + ref + .read(usePageTapZonesStateProvider.notifier) + .set(value); + }), + if (readerMode == ReaderMode.verticalContinuous || + readerMode == ReaderMode.webtoon || + readerMode == ReaderMode.horizontalContinuous) + ValueListenableBuilder( + valueListenable: _autoScrollPage, + builder: (context, valueT, child) { + return Column( + children: [ + SwitchListTile( + secondary: Icon( + valueT ? Icons.timer : Icons.timer_outlined), + value: valueT, + title: Text(context.l10n.auto_scroll, + style: TextStyle( + color: Theme.of(context) + .textTheme + .bodyLarge! + .color! + .withOpacity(0.9), + fontSize: 14)), + onChanged: (val) { + _readerController.setAutoScroll( + val, _pageOffset.value); + _autoScrollPage.value = val; + _autoScroll.value = val; + }), + if (valueT) + ValueListenableBuilder( + valueListenable: _pageOffset, + builder: (context, value, child) => Slider( + min: 2.0, + max: 30.0, + divisions: max(28, 3), + value: value, + onChanged: (val) { + _pageOffset.value = val; + }, + onChangeEnd: (val) { + _readerController.setAutoScroll( + valueT, val); + }), + ), + ], + ); + }, + ), + ], + ), + ), + ); + }), + Consumer(builder: (context, ref, chil) { + final showPageNumber = ref.watch(_showPagesNumber); + final animatePageTransitions = + ref.watch(animatePageTransitionsStateProvider); + final scaleType = ref.watch(scaleTypeStateProvider); + final fullScreenReader = ref.watch(fullScreenReaderStateProvider); + final backgroundColor = ref.watch(backgroundColorStateProvider); + return SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + CustomPopupMenuButton( + label: l10n.background_color, + title: getBackgroundColorName(backgroundColor, context), + onSelected: (value) { + ref.read(backgroundColorStateProvider.notifier).set(value); + }, + value: backgroundColor, + list: BackgroundColor.values, + itemText: (color) { + return getBackgroundColorName(color, context); + }, + ), + CustomPopupMenuButton( + label: l10n.scale_type, + title: getScaleTypeNames(context)[scaleType.index], + onSelected: (value) { + ref + .read(scaleTypeStateProvider.notifier) + .set(ScaleType.values[value.index]); + }, + value: scaleType, + list: ScaleType.values.where((scale) { + try { + return getScaleTypeNames(context) + .contains(getScaleTypeNames(context)[scale.index]); + } catch (_) { + return false; + } + }).toList(), + itemText: (scale) { + return getScaleTypeNames(context)[scale.index]; + }, + ), + SwitchListTile( + value: fullScreenReader, + title: Text( + l10n.fullscreen, + style: TextStyle( + color: Theme.of(context) + .textTheme + .bodyLarge! + .color! + .withOpacity(0.9), + fontSize: 14), + ), + onChanged: (value) { + _setFullScreen(value: value); + }), + SwitchListTile( + value: showPageNumber, + title: Text( + l10n.show_page_number, + style: TextStyle( + color: Theme.of(context) + .textTheme + .bodyLarge! + .color! + .withOpacity(0.9), + fontSize: 14), + ), + onChanged: (value) { + ref.read(_showPagesNumber.notifier).state = value; + _readerController.setShowPageNumber(value); + }), + SwitchListTile( + value: animatePageTransitions, + title: Text( + l10n.animate_page_transitions, + style: TextStyle( + color: Theme.of(context) + .textTheme + .bodyLarge! + .color! + .withOpacity(0.9), + fontSize: 14), + ), + onChanged: (value) { + ref + .read(animatePageTransitionsStateProvider.notifier) + .set(value); + }), + ], + ), + ), + ); + }), + Consumer(builder: (context, ref, chil) { + final customColorFilter = ref.watch(customColorFilterStateProvider); + final enableCustomColorFilter = + ref.watch(enableCustomColorFilterStateProvider); + int r = customColorFilter?.r ?? 0; + int g = customColorFilter?.g ?? 0; + int b = customColorFilter?.b ?? 0; + int a = customColorFilter?.a ?? 0; + final colorFilterBlendMode = + ref.watch(colorFilterBlendModeStateProvider); + return SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 20), + child: Column( + crossAxisAlignment: CrossAxisAlignment.start, + children: [ + SwitchListTile( + value: enableCustomColorFilter, + title: Text( + l10n.custom_color_filter, + style: TextStyle( + color: Theme.of(context) + .textTheme + .bodyLarge! + .color! + .withOpacity(0.9), + fontSize: 14), + ), + onChanged: (value) { + ref + .read(enableCustomColorFilterStateProvider.notifier) + .set(value); + }), + if (enableCustomColorFilter) ...[ + rgbaFilterWidget(a, r, g, b, (val) { + if (val.$3 == "r") { + ref + .read(customColorFilterStateProvider.notifier) + .set(a, val.$1.toInt(), g, b, val.$2); + } else if (val.$3 == "g") { + ref + .read(customColorFilterStateProvider.notifier) + .set(a, r, val.$1.toInt(), b, val.$2); + } else if (val.$3 == "b") { + ref + .read(customColorFilterStateProvider.notifier) + .set(a, r, g, val.$1.toInt(), val.$2); + } else { + ref + .read(customColorFilterStateProvider.notifier) + .set(val.$1.toInt(), r, g, b, val.$2); + } + }, context), + CustomPopupMenuButton( + label: l10n.color_filter_blend_mode, + title: getColorFilterBlendModeName( + colorFilterBlendMode, context), + onSelected: (value) { + ref + .read(colorFilterBlendModeStateProvider.notifier) + .set(value); + }, + value: colorFilterBlendMode, + list: ColorFilterBlendMode.values, + itemText: (va) { + return getColorFilterBlendModeName(va, context); + }, + ), + ] + ], + ), + ), + ); + }), + ], context: context, vsync: this, fullWidth: true); + + if (_autoScrollPage.value) { + _autoPagescroll(); + _autoScroll.value = true; + } + } +} + +class UChapDataPreload { + Chapter? chapter; + Directory? directory; + PageUrl? pageUrl; + bool? isLocale; + Uint8List? archiveImage; + int? index; + GetChapterPagesModel? chapterUrlModel; + int? pageIndex; + Uint8List? cropImage; + UChapDataPreload(this.chapter, this.directory, this.pageUrl, this.isLocale, + this.archiveImage, this.index, this.chapterUrlModel, this.pageIndex, + {this.cropImage}); +} + +class CustomPopupMenuButton extends StatelessWidget { + final String label; + final String title; + final ValueChanged onSelected; + final T value; + final List list; + final String Function(T) itemText; + const CustomPopupMenuButton( + {super.key, + required this.label, + required this.title, + required this.onSelected, + required this.value, + required this.list, + required this.itemText}); + + @override + Widget build(BuildContext context) { + return Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: PopupMenuButton( + popUpAnimationStyle: popupAnimationStyle, + tooltip: "", + offset: Offset.fromDirection(1), + color: Colors.black, + onSelected: onSelected, + itemBuilder: (context) => [ + for (var d in list) + PopupMenuItem( + value: d, + child: Row( + children: [ + Icon( + Icons.check, + color: d == value ? Colors.white : Colors.transparent, + ), + const SizedBox(width: 7), + Text( + itemText(d), + style: const TextStyle(color: Colors.white), + ), + ], + )), + ], + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceBetween, + children: [ + Flexible( + child: Text( + label, + style: TextStyle( + color: Theme.of(context) + .textTheme + .bodyLarge! + .color! + .withOpacity(0.9)), + overflow: TextOverflow.ellipsis, + maxLines: 1, + ), + ), + Row( + children: [ + Text(title), + const SizedBox(width: 20), + const Icon(Icons.keyboard_arrow_down_outlined) + ], + ), + ], + ), + ), + ), + ); + } +} + */ \ No newline at end of file diff --git a/lib/router/router.dart b/lib/router/router.dart index ae6b37ac..22346f02 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -3,6 +3,7 @@ import 'package:bot_toast/bot_toast.dart'; import 'package:flutter/foundation.dart'; import 'package:go_router/go_router.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/track_preference.dart'; import 'package:mangayomi/modules/anime/anime_player_view.dart'; @@ -10,6 +11,7 @@ import 'package:mangayomi/modules/browse/extension/edit_code.dart'; import 'package:mangayomi/modules/browse/extension/extension_detail.dart'; import 'package:mangayomi/modules/browse/extension/widgets/create_extension.dart'; import 'package:mangayomi/modules/browse/sources/sources_filter_screen.dart'; +import 'package:mangayomi/modules/novel/novel_reader_view.dart'; import 'package:mangayomi/modules/updates/updates_screen.dart'; import 'package:mangayomi/modules/more/backup_and_restore/backup_and_restore.dart'; import 'package:mangayomi/modules/more/categories/categories_screen.dart'; @@ -85,12 +87,12 @@ class RouterNotifier extends ChangeNotifier { name: "MangaLibrary", path: '/MangaLibrary', builder: (context, state) => const LibraryScreen( - isManga: true, + itemType: ItemType.manga, ), pageBuilder: (context, state) => transitionPage( key: state.pageKey, child: const LibraryScreen( - isManga: true, + itemType: ItemType.manga, ), ), ), @@ -98,12 +100,25 @@ class RouterNotifier extends ChangeNotifier { name: "AnimeLibrary", path: '/AnimeLibrary', builder: (context, state) => const LibraryScreen( - isManga: false, + itemType: ItemType.anime, ), pageBuilder: (context, state) => transitionPage( key: state.pageKey, child: const LibraryScreen( - isManga: false, + itemType: ItemType.anime, + ), + ), + ), + GoRoute( + name: "NovelLibrary", + path: '/NovelLibrary', + builder: (context, state) => const LibraryScreen( + itemType: ItemType.novel, + ), + pageBuilder: (context, state) => transitionPage( + key: state.pageKey, + child: const LibraryScreen( + itemType: ItemType.novel, ), ), ), @@ -183,8 +198,8 @@ class RouterNotifier extends ChangeNotifier { )); }), GoRoute( - path: "/mangareaderview", - name: "mangareaderview", + path: "/mangaReaderView", + name: "mangaReaderView", builder: (context, state) { final chapter = state.extra as Chapter; return MangaReaderView( @@ -220,6 +235,25 @@ class RouterNotifier extends ChangeNotifier { ); }, ), + /*GoRoute( + path: "/novelReaderView", + name: "novelReaderView", + builder: (context, state) { + final chapter = state.extra as Chapter; + return NovelReaderView( + chapter: chapter, + ); + }, + pageBuilder: (context, state) { + final chapter = state.extra as Chapter; + return transitionPage( + key: state.pageKey, + child: NovelReaderView( + chapter: chapter, + ), + ); + }, + ),*/ GoRoute( path: "/ExtensionLang", name: "ExtensionLang", diff --git a/lib/services/aniskip.g.dart b/lib/services/aniskip.g.dart index 8671826a..022352c8 100644 --- a/lib/services/aniskip.g.dart +++ b/lib/services/aniskip.g.dart @@ -6,7 +6,7 @@ part of 'aniskip.dart'; // RiverpodGenerator // ************************************************************************** -String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c'; +String _$aniSkipHash() => r'887869b54e2e151633efd46da83bde845e14f421'; /// See also [AniSkip]. @ProviderFor(AniSkip) diff --git a/lib/services/trackers/anilist.g.dart b/lib/services/trackers/anilist.g.dart index faf2a6c6..04d288c6 100644 --- a/lib/services/trackers/anilist.g.dart +++ b/lib/services/trackers/anilist.g.dart @@ -6,7 +6,7 @@ part of 'anilist.dart'; // RiverpodGenerator // ************************************************************************** -String _$anilistHash() => r'd3a8852d689b13c3bde46ec05b464e7779149e58'; +String _$anilistHash() => r'87784b25bccf5b1c61d6c7494f0569a28494dd8b'; /// Copied from Dart SDK class _SystemHash {