From 04ddbb6ac7f6a28d8979f279152ed2caa51e7df1 Mon Sep 17 00:00:00 2001 From: playerterra1 Date: Thu, 31 Oct 2024 13:53:55 +0000 Subject: [PATCH 01/18] 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 f050dd0..34f82d9 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 4cf4040..8a108f8 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 fddee08..306a135 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 ab1f0ee..8dcbd4e 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 19b0593..2465e0e 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 3b11ebd..19d099d 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 5db084e..ba0bc15 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 9f925e2..fe10556 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 8f94625..4824251 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 0494e6b..c18082c 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 b1b005e..caa029f 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 fb964e8..e03f9bc 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 d4be4a3..e73bac3 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 5e22641..e44cbee 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 5f2d9f5..313e27b 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 e7dfe1b..15b75f2 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 7a037c9..b013531 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 31a90a6..7f10e61 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 7123a8e..a3bb4e6 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 dfde4b2..19b1bb7 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 0c865a3..a7b801d 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 73b188f..05e9334 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 c782cfe..52ab33c 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 abde10c..c55f54d 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 4e209c7..c0262d2 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 a5c0314..c116c98 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 288827f..40641cd 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 0000000..c4dc4c9 --- /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 ae6b37a..22346f0 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 8671826..022352c 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 faf2a6c..04d288c 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 { From 752387ccde36b31cfaf8fbaeff98ef367c55f2f7 Mon Sep 17 00:00:00 2001 From: playerterra1 Date: Tue, 5 Nov 2024 14:55:54 +0000 Subject: [PATCH 02/18] changes for novel support --- lib/models/history.dart | 9 +++---- lib/models/manga.dart | 5 ---- .../anime_player_controller_provider.dart | 2 +- .../global_search/global_search_screen.dart | 2 +- .../library/providers/add_torrent.dart | 2 +- .../library/providers/local_archive.dart | 1 - .../widgets/library_gridview_widget.dart | 2 +- .../widgets/library_listview_widget.dart | 2 +- lib/modules/main_view/main_screen.dart | 23 ++++++++++++++---- .../main_view/providers/migration.dart | 8 +++---- .../widgets/manga_image_card_widget.dart | 24 +++++++++---------- 11 files changed, 44 insertions(+), 36 deletions(-) diff --git a/lib/models/history.dart b/lib/models/history.dart index 5bf3dc8..ea7b50c 100644 --- a/lib/models/history.dart +++ b/lib/models/history.dart @@ -1,5 +1,6 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/manga.dart'; part 'history.g.dart'; @collection @@ -11,7 +12,7 @@ class History { int? chapterId; - bool? isManga; + ItemType? itemType; final chapter = IsarLink(); @@ -19,7 +20,7 @@ class History { History({ this.id = Isar.autoIncrement, - required this.isManga, + required this.itemType, required this.chapterId, required this.mangaId, required this.date, @@ -29,7 +30,7 @@ class History { chapterId = json['chapterId']; date = json['date']; id = json['id']; - isManga = json['isManga']; + itemType = json['itemType']; mangaId = json['mangaId']; } @@ -37,7 +38,7 @@ class History { 'chapterId': chapterId, 'date': date, 'id': id, - 'isManga': isManga, + 'itemType': itemType, 'mangaId': mangaId }; } diff --git a/lib/models/manga.dart b/lib/models/manga.dart index 2465e0e..1298106 100644 --- a/lib/models/manga.dart +++ b/lib/models/manga.dart @@ -22,8 +22,6 @@ class Manga { @enumerated late Status status; - bool? isManga; - @enumerated late ItemType itemType; @@ -65,7 +63,6 @@ class Manga { required this.name, required this.status, required this.description, - this.isManga = true, this.itemType = ItemType.manga, this.dateAdded, this.lastUpdate, @@ -87,7 +84,6 @@ class Manga { id = json['id']; imageUrl = json['imageUrl']; isLocalArchive = json['isLocalArchive']; - isManga = json['isManga']; itemType = ItemType.values[json['itemType']]; lang = json['lang']; lastRead = json['lastRead']; @@ -111,7 +107,6 @@ class Manga { 'id': id, 'imageUrl': imageUrl, 'isLocalArchive': isLocalArchive, - 'isManga': isManga, 'itemType': itemType.index, 'lang': lang, 'lastRead': lastRead, diff --git a/lib/modules/anime/providers/anime_player_controller_provider.dart b/lib/modules/anime/providers/anime_player_controller_provider.dart index 5be1355..fffa52d 100644 --- a/lib/modules/anime/providers/anime_player_controller_provider.dart +++ b/lib/modules/anime/providers/anime_player_controller_provider.dart @@ -133,7 +133,7 @@ class AnimeStreamController extends _$AnimeStreamController { history = History( mangaId: getAnime().id, date: DateTime.now().millisecondsSinceEpoch.toString(), - isManga: getAnime().isManga, + itemType: getAnime().itemType, chapterId: episode.id) ..chapter.value = episode; } else { diff --git a/lib/modules/browse/global_search/global_search_screen.dart b/lib/modules/browse/global_search/global_search_screen.dart index 17f037f..5ae7146 100644 --- a/lib/modules/browse/global_search/global_search_screen.dart +++ b/lib/modules/browse/global_search/global_search_screen.dart @@ -236,7 +236,7 @@ class _MangaGlobalImageCardState extends ConsumerState context: context, getManga: getMangaDetail, lang: widget.source.lang!, - isManga: widget.source.isManga ?? true, + itemType: widget.source.itemType, useMaterialRoute: true, source: widget.source.name!); }, diff --git a/lib/modules/library/providers/add_torrent.dart b/lib/modules/library/providers/add_torrent.dart index d87e637..ded7dd1 100644 --- a/lib/modules/library/providers/add_torrent.dart +++ b/lib/modules/library/providers/add_torrent.dart @@ -32,7 +32,7 @@ Future addTorrentFromUrlOrFromFile( favorite: true, source: 'torrent', author: '', - isManga: false, + itemType: ItemType.anime, genre: [], imageUrl: '', lang: '', diff --git a/lib/modules/library/providers/local_archive.dart b/lib/modules/library/providers/local_archive.dart index 15b75f2..95a9af4 100644 --- a/lib/modules/library/providers/local_archive.dart +++ b/lib/modules/library/providers/local_archive.dart @@ -24,7 +24,6 @@ Future importArchivesFromFile(ImportArchivesFromFileRef ref, Manga? mManga, favorite: true, source: 'archive', author: '', - isManga: itemType == ItemType.manga, itemType: itemType, genre: [], imageUrl: '', diff --git a/lib/modules/library/widgets/library_gridview_widget.dart b/lib/modules/library/widgets/library_gridview_widget.dart index 7f10e61..e9c6212 100644 --- a/lib/modules/library/widgets/library_gridview_widget.dart +++ b/lib/modules/library/widgets/library_gridview_widget.dart @@ -279,7 +279,7 @@ class _LibraryGridViewWidgetState extends State { .idIsNotNull() .and() .chapter((q) => q.manga((q) => - q.isMangaEqualTo(entry.isManga!))) + q.itemTypeEqualTo(entry.itemType!))) .watch(fireImmediately: true), builder: (context, snapshot) { if (snapshot.hasData && diff --git a/lib/modules/library/widgets/library_listview_widget.dart b/lib/modules/library/widgets/library_listview_widget.dart index a3bb4e6..2a93fe2 100644 --- a/lib/modules/library/widgets/library_listview_widget.dart +++ b/lib/modules/library/widgets/library_listview_widget.dart @@ -264,7 +264,7 @@ class LibraryListViewWidget extends StatelessWidget { .idIsNotNull() .and() .chapter((q) => q.manga((q) => - q.isMangaEqualTo(entry.isManga!))) + q.itemTypeEqualTo(entry.itemType))) .watch(fireImmediately: true), builder: (context, snapshot) { if (snapshot.hasData && diff --git a/lib/modules/main_view/main_screen.dart b/lib/modules/main_view/main_screen.dart index 19b1bb7..e19a484 100644 --- a/lib/modules/main_view/main_screen.dart +++ b/lib/modules/main_view/main_screen.dart @@ -42,11 +42,12 @@ class MainScreen extends ConsumerWidget { location == '/mangaReaderView' || location == '/animePlayerView' || location == '/novelReaderView'; int currentIndex = switch (location) { null || '/MangaLibrary' => 0, - '/AnimeLibrary' => 1, // TODO add /NovelLibrary + '/AnimeLibrary' => 1, '/updates' => 2, '/history' => 3, '/browse' => 4, - _ => 5, + '/NovelLibrary' => 5, + _ => 6, }; final incognitoMode = ref.watch(incognitoModeStateProvider); @@ -95,6 +96,7 @@ class MainScreen extends ConsumerWidget { null => 100, != '/MangaLibrary' && != '/AnimeLibrary' && + != '/NovelLibrary' && != '/history' && != '/updates' && != '/browse' && @@ -134,6 +136,15 @@ class MainScreen extends ConsumerWidget { padding: const EdgeInsets.only( top: 5), child: Text(l10n.anime))), + NavigationRailDestination( + selectedIcon: const Icon( + Icons.local_library), + icon: const Icon(Icons + .local_library_outlined), + label: Padding( + padding: const EdgeInsets.only( + top: 5), + child: Text(l10n.novel))), NavigationRailDestination( selectedIcon: const Icon(Icons.new_releases), @@ -180,9 +191,10 @@ class MainScreen extends ConsumerWidget { final fn = switch (newIndex) { 0 => route.go('/MangaLibrary'), 1 => route.go('/AnimeLibrary'), - 2 => route.go('/updates'), - 3 => route.go('/history'), - 4 => route.go('/browse'), + 2 => route.go('/NovelLibrary'), + 3 => route.go('/updates'), + 4 => route.go('/history'), + 5 => route.go('/browse'), _ => route.go('/more'), }; fn; @@ -216,6 +228,7 @@ class MainScreen extends ConsumerWidget { null => null, != '/MangaLibrary' && != '/AnimeLibrary' && + != '/NovelLibrary' && != '/history' && != '/updates' && != '/browse' && diff --git a/lib/modules/main_view/providers/migration.dart b/lib/modules/main_view/providers/migration.dart index e68b930..79b21d3 100644 --- a/lib/modules/main_view/providers/migration.dart +++ b/lib/modules/main_view/providers/migration.dart @@ -39,15 +39,15 @@ Future migration(MigrationRef ref) async { //chapterId and isManga in History for (var history in histories) { final chapterId = history.chapter.value?.id; - final isManga = history.chapter.value?.manga.value?.isManga; + final itemType = history.chapter.value?.manga.value?.itemType; isar.historys.putSync(history ..chapterId = chapterId - ..isManga = isManga); + ..itemType = itemType); } // isManga in Track for (var track in tracks) { - final isManga = isar.mangas.getSync(track.mangaId!)?.isManga; - isar.tracks.putSync(track..isManga = isManga); + final itemType = isar.mangas.getSync(track.mangaId!)?.itemType; + isar.tracks.putSync(track..itemType = itemType); } }); } diff --git a/lib/modules/widgets/manga_image_card_widget.dart b/lib/modules/widgets/manga_image_card_widget.dart index 642614c..69e5089 100644 --- a/lib/modules/widgets/manga_image_card_widget.dart +++ b/lib/modules/widgets/manga_image_card_widget.dart @@ -19,7 +19,7 @@ import 'package:mangayomi/modules/widgets/cover_view_widget.dart'; class MangaImageCardWidget extends ConsumerWidget { final Source source; - final bool isManga; + final ItemType itemType; final bool isComfortableGrid; final MManga? getMangaDetail; @@ -28,7 +28,7 @@ class MangaImageCardWidget extends ConsumerWidget { super.key, required this.getMangaDetail, required this.isComfortableGrid, - required this.isManga}); + required this.itemType}); @override Widget build(BuildContext context, WidgetRef ref) { @@ -68,7 +68,7 @@ class MangaImageCardWidget extends ConsumerWidget { getManga: getMangaDetail!, lang: source.lang!, source: source.name!, - isManga: isManga); + itemType: itemType); }, onLongPress: () { pushToMangaReaderDetail( @@ -76,7 +76,7 @@ class MangaImageCardWidget extends ConsumerWidget { getManga: getMangaDetail!, lang: source.lang!, source: source.name!, - isManga: isManga, + itemType: itemType, addToFavourite: true); }, onSecondaryTap: () { @@ -85,7 +85,7 @@ class MangaImageCardWidget extends ConsumerWidget { getManga: getMangaDetail!, lang: source.lang!, source: source.name!, - isManga: isManga, + itemType: itemType, addToFavourite: true); }, children: [ @@ -121,13 +121,13 @@ class MangaImageCardWidget extends ConsumerWidget { class MangaImageCardListTileWidget extends ConsumerWidget { final Source source; - final bool isManga; + final ItemType itemType; final MManga? getMangaDetail; const MangaImageCardListTileWidget( {required this.source, super.key, - required this.isManga, + required this.itemType, required this.getMangaDetail}); @override @@ -166,7 +166,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget { getManga: getMangaDetail!, lang: source.lang!, source: source.name!, - isManga: isManga); + itemType: itemType); }, onLongPress: () { pushToMangaReaderDetail( @@ -174,7 +174,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget { getManga: getMangaDetail!, lang: source.lang!, source: source.name!, - isManga: isManga, + itemType: itemType, addToFavourite: true); }, onSecondaryTap: () { @@ -183,7 +183,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget { getManga: getMangaDetail!, lang: source.lang!, source: source.name!, - isManga: isManga, + itemType: itemType, addToFavourite: true); }, child: Row( @@ -252,7 +252,7 @@ Future pushToMangaReaderDetail( required String source, int? archiveId, Manga? mangaM, - bool? isManga, + ItemType? itemType, bool useMaterialRoute = false, bool addToFavourite = false}) async { int? mangaId; @@ -269,7 +269,7 @@ Future pushToMangaReaderDetail( source: source, lang: lang, lastUpdate: 0, - isManga: isManga ?? true, + itemType: itemType ?? ItemType.manga, artist: getManga.artist ?? ''); final empty = isar.mangas .filter() From 34a451d374c41404234f180e4fd4e425df494e49 Mon Sep 17 00:00:00 2001 From: playerterra1 Date: Fri, 8 Nov 2024 13:18:58 +0000 Subject: [PATCH 03/18] add novel support --- lib/models/history.dart | 3 +- lib/models/history.g.dart | 115 +++++++++++----- lib/models/manga.g.dart | 127 ++++-------------- .../anime_player_controller_provider.g.dart | 2 +- lib/modules/history/history_screen.dart | 27 ++-- .../history/providers/isar_providers.dart | 8 +- .../history/providers/isar_providers.g.dart | 60 ++++----- .../library/providers/add_torrent.g.dart | 2 +- .../library/providers/local_archive.g.dart | 2 +- .../main_view/providers/migration.dart | 13 +- .../main_view/providers/migration.g.dart | 2 +- .../manga/detail/manga_detail_view.dart | 33 +++-- .../manga/detail/manga_details_view.dart | 12 +- .../update_manga_detail_providers.dart | 2 +- .../update_manga_detail_providers.g.dart | 2 +- .../widgets/chapter_list_tile_widget.dart | 3 +- .../download/providers/download_provider.dart | 11 +- .../providers/download_provider.g.dart | 2 +- lib/modules/manga/home/manga_home_screen.dart | 17 +-- .../reader_controller_provider.g.dart | 2 +- .../more/categories/categories_screen.dart | 4 +- lib/modules/updates/updates_screen.dart | 33 +++-- lib/providers/storage_provider.dart | 18 ++- 23 files changed, 268 insertions(+), 232 deletions(-) diff --git a/lib/models/history.dart b/lib/models/history.dart index ea7b50c..7f27807 100644 --- a/lib/models/history.dart +++ b/lib/models/history.dart @@ -12,7 +12,8 @@ class History { int? chapterId; - ItemType? itemType; + @enumerated + late ItemType itemType; final chapter = IsarLink(); diff --git a/lib/models/history.g.dart b/lib/models/history.g.dart index c07edc7..0ac2f83 100644 --- a/lib/models/history.g.dart +++ b/lib/models/history.g.dart @@ -27,10 +27,11 @@ const HistorySchema = CollectionSchema( name: r'date', type: IsarType.string, ), - r'isManga': PropertySchema( + r'itemType': PropertySchema( id: 2, - name: r'isManga', - type: IsarType.bool, + name: r'itemType', + type: IsarType.byte, + enumMap: _HistoryitemTypeEnumValueMap, ), r'mangaId': PropertySchema( id: 3, @@ -82,7 +83,7 @@ void _historySerialize( ) { writer.writeLong(offsets[0], object.chapterId); writer.writeString(offsets[1], object.date); - writer.writeBool(offsets[2], object.isManga); + writer.writeByte(offsets[2], object.itemType.index); writer.writeLong(offsets[3], object.mangaId); } @@ -96,7 +97,8 @@ History _historyDeserialize( chapterId: reader.readLongOrNull(offsets[0]), date: reader.readStringOrNull(offsets[1]), id: id, - isManga: reader.readBoolOrNull(offsets[2]), + itemType: _HistoryitemTypeValueEnumMap[reader.readByteOrNull(offsets[2])] ?? + ItemType.manga, mangaId: reader.readLongOrNull(offsets[3]), ); return object; @@ -114,7 +116,8 @@ P _historyDeserializeProp

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

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

( case 10: return (reader.readBoolOrNull(offset)) as P; case 11: - return (reader.readBoolOrNull(offset)) as P; - case 12: return (_MangaitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? ItemType.manga) as P; - case 13: + case 12: return (reader.readStringOrNull(offset)) as P; + case 13: + return (reader.readLongOrNull(offset)) as P; case 14: return (reader.readLongOrNull(offset)) as P; case 15: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 16: return (reader.readStringOrNull(offset)) as P; case 17: return (reader.readStringOrNull(offset)) as P; case 18: - return (reader.readStringOrNull(offset)) as P; - case 19: return (_MangastatusValueEnumMap[reader.readByteOrNull(offset)] ?? Status.ongoing) as P; default: @@ -1933,32 +1924,6 @@ extension MangaQueryFilter on QueryBuilder { }); } - QueryBuilder isMangaIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isManga', - )); - }); - } - - QueryBuilder isMangaIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isManga', - )); - }); - } - - QueryBuilder isMangaEqualTo( - bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isManga', - value: value, - )); - }); - } - QueryBuilder itemTypeEqualTo( ItemType value) { return QueryBuilder.apply(this, (query) { @@ -2938,18 +2903,6 @@ extension MangaQuerySortBy on QueryBuilder { }); } - QueryBuilder sortByIsManga() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'isManga', Sort.asc); - }); - } - - QueryBuilder sortByIsMangaDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'isManga', Sort.desc); - }); - } - QueryBuilder sortByItemType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'itemType', Sort.asc); @@ -3156,18 +3109,6 @@ extension MangaQuerySortThenBy on QueryBuilder { }); } - QueryBuilder thenByIsManga() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'isManga', Sort.asc); - }); - } - - QueryBuilder thenByIsMangaDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'isManga', Sort.desc); - }); - } - QueryBuilder thenByItemType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'itemType', Sort.asc); @@ -3338,12 +3279,6 @@ extension MangaQueryWhereDistinct on QueryBuilder { }); } - QueryBuilder distinctByIsManga() { - return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'isManga'); - }); - } - QueryBuilder distinctByItemType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'itemType'); @@ -3471,12 +3406,6 @@ extension MangaQueryProperty on QueryBuilder { }); } - QueryBuilder isMangaProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'isManga'); - }); - } - QueryBuilder itemTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'itemType'); diff --git a/lib/modules/anime/providers/anime_player_controller_provider.g.dart b/lib/modules/anime/providers/anime_player_controller_provider.g.dart index 66a5354..dfc6c72 100644 --- a/lib/modules/anime/providers/anime_player_controller_provider.g.dart +++ b/lib/modules/anime/providers/anime_player_controller_provider.g.dart @@ -7,7 +7,7 @@ part of 'anime_player_controller_provider.dart'; // ************************************************************************** String _$animeStreamControllerHash() => - r'0d97207a4d015d5089766ccbeeba093c55cb1ef9'; + r'd3ec7fe7ac2af84393b128e430fd2f5b9224ed14'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/history/history_screen.dart b/lib/modules/history/history_screen.dart index 20fc747..bc78e31 100644 --- a/lib/modules/history/history_screen.dart +++ b/lib/modules/history/history_screen.dart @@ -119,10 +119,14 @@ class _HistoryScreenState extends ConsumerState List histories = isar.historys .filter() .idIsNotNull() - .chapter((q) => q.manga((q) => - q.isMangaEqualTo( - _tabBarController.index == - 0))) + .chapter((q) => q.manga((q) => q + .itemTypeEqualTo(_tabBarController + .index == + 0 + ? ItemType.manga + : _tabBarController.index == 1 + ? ItemType.anime + : ItemType.novel))) .findAllSync() .toList(); isar.writeTxnSync(() { @@ -150,6 +154,7 @@ class _HistoryScreenState extends ConsumerState tabs: [ Tab(text: l10n.manga), Tab(text: l10n.anime), + Tab(text: l10n.novel), ], ), ), @@ -157,11 +162,15 @@ class _HistoryScreenState extends ConsumerState padding: const EdgeInsets.only(top: 10), child: TabBarView(controller: _tabBarController, children: [ HistoryTab( - isManga: true, + itemType: ItemType.manga, query: _textEditingController.text, ), HistoryTab( - isManga: false, + itemType: ItemType.anime, + query: _textEditingController.text, + ), + HistoryTab( + itemType: ItemType.novel, query: _textEditingController.text, ) ]), @@ -173,8 +182,8 @@ class _HistoryScreenState extends ConsumerState class HistoryTab extends ConsumerStatefulWidget { final String query; - final bool isManga; - const HistoryTab({required this.isManga, required this.query, super.key}); + final ItemType itemType; + const HistoryTab({required this.itemType, required this.query, super.key}); @override ConsumerState createState() => _HistoryTabState(); @@ -185,7 +194,7 @@ class _HistoryTabState extends ConsumerState { Widget build(BuildContext context) { final l10n = l10nLocalizations(context)!; final history = - ref.watch(getAllHistoryStreamProvider(isManga: widget.isManga)); + ref.watch(getAllHistoryStreamProvider(itemType: widget.itemType)); return Scaffold( body: history.when( data: (data) { diff --git a/lib/modules/history/providers/isar_providers.dart b/lib/modules/history/providers/isar_providers.dart index 049f4a2..4ecd738 100644 --- a/lib/modules/history/providers/isar_providers.dart +++ b/lib/modules/history/providers/isar_providers.dart @@ -9,22 +9,22 @@ part 'isar_providers.g.dart'; @riverpod Stream> getAllHistoryStream(GetAllHistoryStreamRef ref, - {required bool isManga}) async* { + {required ItemType itemType}) async* { yield* isar.historys .filter() .idIsNotNull() .and() - .chapter((q) => q.manga((q) => q.isMangaEqualTo(isManga))) + .chapter((q) => q.manga((q) => q.itemTypeEqualTo(itemType))) .watch(fireImmediately: true); } @riverpod Stream> getAllUpdateStream(GetAllUpdateStreamRef ref, - {required bool isManga}) async* { + {required ItemType itemType}) async* { yield* isar.updates .filter() .idIsNotNull() .and() - .chapter((q) => q.manga((q) => q.isMangaEqualTo(isManga))) + .chapter((q) => q.manga((q) => q.itemTypeEqualTo(itemType))) .watch(fireImmediately: true); } diff --git a/lib/modules/history/providers/isar_providers.g.dart b/lib/modules/history/providers/isar_providers.g.dart index ba1149b..eb4c5a8 100644 --- a/lib/modules/history/providers/isar_providers.g.dart +++ b/lib/modules/history/providers/isar_providers.g.dart @@ -7,7 +7,7 @@ part of 'isar_providers.dart'; // ************************************************************************** String _$getAllHistoryStreamHash() => - r'32dc5fa16315f199a5c86ee99cf59b7190c4d28e'; + r'381b5515484ce36a197b91e7d5f17037177dd0f0'; /// Copied from Dart SDK class _SystemHash { @@ -41,10 +41,10 @@ class GetAllHistoryStreamFamily extends Family>> { /// See also [getAllHistoryStream]. GetAllHistoryStreamProvider call({ - required bool isManga, + required ItemType itemType, }) { return GetAllHistoryStreamProvider( - isManga: isManga, + itemType: itemType, ); } @@ -53,7 +53,7 @@ class GetAllHistoryStreamFamily extends Family>> { covariant GetAllHistoryStreamProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -77,11 +77,11 @@ class GetAllHistoryStreamProvider extends AutoDisposeStreamProvider> { /// See also [getAllHistoryStream]. GetAllHistoryStreamProvider({ - required bool isManga, + required ItemType itemType, }) : this._internal( (ref) => getAllHistoryStream( ref as GetAllHistoryStreamRef, - isManga: isManga, + itemType: itemType, ), from: getAllHistoryStreamProvider, name: r'getAllHistoryStreamProvider', @@ -92,7 +92,7 @@ class GetAllHistoryStreamProvider dependencies: GetAllHistoryStreamFamily._dependencies, allTransitiveDependencies: GetAllHistoryStreamFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, ); GetAllHistoryStreamProvider._internal( @@ -102,10 +102,10 @@ class GetAllHistoryStreamProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, }) : super.internal(); - final bool isManga; + final ItemType itemType; @override Override overrideWith( @@ -120,7 +120,7 @@ class GetAllHistoryStreamProvider dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, ), ); } @@ -132,21 +132,21 @@ class GetAllHistoryStreamProvider @override bool operator ==(Object other) { - return other is GetAllHistoryStreamProvider && other.isManga == isManga; + return other is GetAllHistoryStreamProvider && other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } } mixin GetAllHistoryStreamRef on AutoDisposeStreamProviderRef> { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _GetAllHistoryStreamProviderElement @@ -155,11 +155,11 @@ class _GetAllHistoryStreamProviderElement _GetAllHistoryStreamProviderElement(super.provider); @override - bool get isManga => (origin as GetAllHistoryStreamProvider).isManga; + ItemType get itemType => (origin as GetAllHistoryStreamProvider).itemType; } String _$getAllUpdateStreamHash() => - r'9f62b36ef0b268ee8c3cc93a10f8963def8dfbb0'; + r'44fb6b980fb11c51c4b6a6956104b02b7ae0a8ca'; /// See also [getAllUpdateStream]. @ProviderFor(getAllUpdateStream) @@ -172,10 +172,10 @@ class GetAllUpdateStreamFamily extends Family>> { /// See also [getAllUpdateStream]. GetAllUpdateStreamProvider call({ - required bool isManga, + required ItemType itemType, }) { return GetAllUpdateStreamProvider( - isManga: isManga, + itemType: itemType, ); } @@ -184,7 +184,7 @@ class GetAllUpdateStreamFamily extends Family>> { covariant GetAllUpdateStreamProvider provider, ) { return call( - isManga: provider.isManga, + itemType: provider.itemType, ); } @@ -208,11 +208,11 @@ class GetAllUpdateStreamProvider extends AutoDisposeStreamProvider> { /// See also [getAllUpdateStream]. GetAllUpdateStreamProvider({ - required bool isManga, + required ItemType itemType, }) : this._internal( (ref) => getAllUpdateStream( ref as GetAllUpdateStreamRef, - isManga: isManga, + itemType: itemType, ), from: getAllUpdateStreamProvider, name: r'getAllUpdateStreamProvider', @@ -223,7 +223,7 @@ class GetAllUpdateStreamProvider dependencies: GetAllUpdateStreamFamily._dependencies, allTransitiveDependencies: GetAllUpdateStreamFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, ); GetAllUpdateStreamProvider._internal( @@ -233,10 +233,10 @@ class GetAllUpdateStreamProvider required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.isManga, + required this.itemType, }) : super.internal(); - final bool isManga; + final ItemType itemType; @override Override overrideWith( @@ -251,7 +251,7 @@ class GetAllUpdateStreamProvider dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, ), ); } @@ -263,21 +263,21 @@ class GetAllUpdateStreamProvider @override bool operator ==(Object other) { - return other is GetAllUpdateStreamProvider && other.isManga == isManga; + return other is GetAllUpdateStreamProvider && other.itemType == itemType; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, isManga.hashCode); + hash = _SystemHash.combine(hash, itemType.hashCode); return _SystemHash.finish(hash); } } mixin GetAllUpdateStreamRef on AutoDisposeStreamProviderRef> { - /// The parameter `isManga` of this provider. - bool get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _GetAllUpdateStreamProviderElement @@ -286,7 +286,7 @@ class _GetAllUpdateStreamProviderElement _GetAllUpdateStreamProviderElement(super.provider); @override - bool get isManga => (origin as GetAllUpdateStreamProvider).isManga; + ItemType get itemType => (origin as GetAllUpdateStreamProvider).itemType; } // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member diff --git a/lib/modules/library/providers/add_torrent.g.dart b/lib/modules/library/providers/add_torrent.g.dart index d0cea2f..728fdf6 100644 --- a/lib/modules/library/providers/add_torrent.g.dart +++ b/lib/modules/library/providers/add_torrent.g.dart @@ -7,7 +7,7 @@ part of 'add_torrent.dart'; // ************************************************************************** String _$addTorrentFromUrlOrFromFileHash() => - r'473a3494fd8c5089afdd460637f37faf2a498400'; + r'06b057093b528b06714adbd984d07c5698c2830b'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/library/providers/local_archive.g.dart b/lib/modules/library/providers/local_archive.g.dart index b013531..aee5900 100644 --- a/lib/modules/library/providers/local_archive.g.dart +++ b/lib/modules/library/providers/local_archive.g.dart @@ -7,7 +7,7 @@ part of 'local_archive.dart'; // ************************************************************************** String _$importArchivesFromFileHash() => - r'08e34a4b0ba52b8d3861b297f687c1136f2c5443'; + r'5d196054cc64e03d3efc2f5af098df5542776fec'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/main_view/providers/migration.dart b/lib/modules/main_view/providers/migration.dart index 79b21d3..b316740 100644 --- a/lib/modules/main_view/providers/migration.dart +++ b/lib/modules/main_view/providers/migration.dart @@ -20,10 +20,8 @@ Future migration(MigrationRef ref) async { .chapterIdIsNull() .or() .idIsNotNull() - .isMangaIsNull() .findAllSync(); - final tracks = - isar.tracks.filter().idIsNotNull().isMangaIsNull().findAllSync(); + final tracks = isar.tracks.filter().idIsNotNull().findAllSync(); isar.writeTxnSync(() { //mangaId in chapter @@ -39,15 +37,18 @@ Future migration(MigrationRef ref) async { //chapterId and isManga in History for (var history in histories) { final chapterId = history.chapter.value?.id; - final itemType = history.chapter.value?.manga.value?.itemType; + final itemType = + history.chapter.value?.manga.value?.itemType ?? ItemType.manga; isar.historys.putSync(history ..chapterId = chapterId ..itemType = itemType); } // isManga in Track for (var track in tracks) { - final itemType = isar.mangas.getSync(track.mangaId!)?.itemType; - isar.tracks.putSync(track..itemType = itemType); + final isManga = + (isar.mangas.getSync(track.mangaId!)?.itemType ?? ItemType.manga) == + ItemType.manga; + isar.tracks.putSync(track..isManga = isManga); } }); } diff --git a/lib/modules/main_view/providers/migration.g.dart b/lib/modules/main_view/providers/migration.g.dart index 424c774..6ca4816 100644 --- a/lib/modules/main_view/providers/migration.g.dart +++ b/lib/modules/main_view/providers/migration.g.dart @@ -6,7 +6,7 @@ part of 'migration.dart'; // RiverpodGenerator // ************************************************************************** -String _$migrationHash() => r'6b3ff1b28168381079986d619b30c31ce44f341f'; +String _$migrationHash() => r'8c5ba50ce563fc75a7185a99cb77759a8ef71964'; /// See also [migration]. @ProviderFor(migration) diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index a7b801d..5b9dd20 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -511,7 +511,12 @@ class _MangaDetailViewState extends ConsumerState if (value == 0) { context.push("/categories", extra: ( true, - widget.manga!.isManga! ? 0 : 1 + widget.manga!.itemType == ItemType.manga + ? 0 + : widget.manga!.itemType == + ItemType.anime + ? 1 + : 2 )); } else if (value == 1) { } else if (value == 2) { @@ -585,7 +590,9 @@ class _MangaDetailViewState extends ConsumerState 8), child: Text( widget.manga! - .isManga! + .itemType != + ItemType + .anime ? l10n.n_chapters( chapters .length) @@ -614,7 +621,10 @@ class _MangaDetailViewState extends ConsumerState color: context .secondaryColor), label: Text( - widget.manga!.isManga! + widget.manga! + .itemType != + ItemType + .anime ? l10n .add_chapters : l10n @@ -1363,7 +1373,7 @@ class _MangaDetailViewState extends ConsumerState padding: const EdgeInsets.symmetric(horizontal: 8), child: Text( - widget.manga!.isManga! + widget.manga!.itemType != ItemType.anime ? l10n.n_chapters(chapterLength) : l10n.n_episodes(chapterLength), style: const TextStyle( @@ -1380,7 +1390,7 @@ class _MangaDetailViewState extends ConsumerState icon: Icon(Icons.add, color: context.secondaryColor), label: Text( - widget.manga!.isManga! + widget.manga!.itemType != ItemType.anime ? l10n.add_chapters : l10n.add_episodes, style: TextStyle( @@ -1660,7 +1670,8 @@ class _MangaDetailViewState extends ConsumerState final trackSearch = await trackersSearchraggableMenu( context, - isManga: widget.manga!.isManga!, + isManga: widget.manga!.itemType != + ItemType.anime, track: Track( status: TrackStatus.planToRead, @@ -1978,14 +1989,16 @@ class _MangaDetailViewState extends ConsumerState mangaId: widget.manga!.id!, syncId: entries[index].syncId!, trackRes: trackRes.first, - isManga: widget.manga!.isManga!) + isManga: + widget.manga!.itemType == ItemType.manga) : TrackListile( text: l10nLocalizations(context)!.add_tracker, onTap: () async { final trackSearch = await trackersSearchraggableMenu( context, - isManga: widget.manga!.isManga!, + isManga: widget.manga!.itemType != + ItemType.anime, track: Track( status: TrackStatus.planToRead, syncId: entries[index].syncId!, @@ -1995,7 +2008,9 @@ class _MangaDetailViewState extends ConsumerState await ref .read(trackStateProvider( track: null, - isManga: widget.manga!.isManga!) + isManga: + widget.manga!.itemType != + ItemType.anime) .notifier) .setTrackSearch( trackSearch, diff --git a/lib/modules/manga/detail/manga_details_view.dart b/lib/modules/manga/detail/manga_details_view.dart index 05e9334..0534255 100644 --- a/lib/modules/manga/detail/manga_details_view.dart +++ b/lib/modules/manga/detail/manga_details_view.dart @@ -55,7 +55,7 @@ class _MangaDetailsViewState extends ConsumerState { .idIsNotNull() .and() .chapter((q) => q.manga( - (q) => q.isMangaEqualTo(widget.manga.isManga!))) + (q) => q.itemTypeEqualTo(widget.manga.itemType))) .watch(fireImmediately: true), builder: (context, snapshot) { final isFr = @@ -294,8 +294,14 @@ class _MangaDetailsViewState extends ConsumerState { children: [ TextButton( onPressed: () { - context.push("/categories", - extra: (true, widget.manga.isManga! ? 0 : 1)); + context.push("/categories", extra: ( + true, + widget.manga.itemType == ItemType.manga + ? 0 + : widget.manga.itemType == ItemType.anime + ? 1 + : 2 + )); Navigator.pop(context); }, child: Text(l10n.edit)), diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart index 26f2426..780b449 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart @@ -48,7 +48,7 @@ Future updateMangaDetail(UpdateMangaDetailRef ref, ..link = getManga.link?.trim().trimLeft().trimRight() ?? manga.link ..source = manga.source ..lang = manga.lang - ..isManga = source.isManga + ..itemType = source.itemType ..lastUpdate = DateTime.now().millisecondsSinceEpoch; final checkManga = isar.mangas.getSync(mangaId); if (checkManga!.chapters.isNotEmpty && isInit) { diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index 0224ad0..a0d087b 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'736b68c65f624da85b15c0a7a2a263aab8e8df7e'; +String _$updateMangaDetailHash() => r'dd2ea98fa3e4fc0c5fb9c0d3ba8334fe76e77249'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart b/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart index 2d6b8ca..7842e3d 100644 --- a/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart +++ b/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/date.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; @@ -89,7 +90,7 @@ class ChapterListTileWidget extends ConsumerWidget { children: [ const Text(' • '), Text( - !chapter.manga.value!.isManga! + chapter.manga.value!.itemType == ItemType.anime ? l10n.episode_progress(Duration( milliseconds: int.parse(chapter.lastPageRead!)) diff --git a/lib/modules/manga/download/providers/download_provider.dart b/lib/modules/manga/download/providers/download_provider.dart index 915d740..b7fe455 100644 --- a/lib/modules/manga/download/providers/download_provider.dart +++ b/lib/modules/manga/download/providers/download_provider.dart @@ -1,6 +1,7 @@ import 'dart:convert'; import 'dart:io'; import 'dart:typed_data'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/services/background_downloader/background_downloader.dart'; import 'package:isar/isar.dart'; @@ -44,9 +45,15 @@ Future> downloadChapter( : ""; final chapterName = chapter.name!.replaceForbiddenCharacters(' '); - final isManga = chapter.manga.value!.isManga!; + final itemType = chapter.manga.value!.itemType; + final isManga = itemType == ItemType.manga; + final itemTypePath = itemType == ItemType.manga + ? "Manga" + : itemType == ItemType.anime + ? "Anime" + : "Novel"; final finalPath = - "downloads/${isManga ? "Manga" : "Anime"}/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}${isManga ? "/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}" : ""}"; + "downloads/$itemTypePath/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}${isManga ? "/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}" : ""}"; path = Directory("${path1!.path}$finalPath/"); Map videoHeader = {}; bool hasM3U8File = false; diff --git a/lib/modules/manga/download/providers/download_provider.g.dart b/lib/modules/manga/download/providers/download_provider.g.dart index d35b088..fc8d456 100644 --- a/lib/modules/manga/download/providers/download_provider.g.dart +++ b/lib/modules/manga/download/providers/download_provider.g.dart @@ -6,7 +6,7 @@ part of 'download_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$downloadChapterHash() => r'ef2852f888f93e5f344241bc6b486c9dd9037251'; +String _$downloadChapterHash() => r'3f66e451bd49afa53d57630d9f33ce98ab79bfd0'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/home/manga_home_screen.dart b/lib/modules/manga/home/manga_home_screen.dart index 52ab33c..b418618 100644 --- a/lib/modules/manga/home/manga_home_screen.dart +++ b/lib/modules/manga/home/manga_home_screen.dart @@ -5,6 +5,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:mangayomi/eval/dart/model/m_manga.dart'; import 'package:mangayomi/eval/dart/model/m_pages.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/modules/library/providers/library_state_provider.dart'; @@ -548,7 +549,7 @@ class _MangaHomeScreenState extends ConsumerState { return buildProgressIndicator(); } return MangaHomeImageCardListTile( - isManga: source.isManga ?? true, + itemType: source.itemType, manga: _mangaList[index], source: source); }) @@ -568,7 +569,7 @@ class _MangaHomeScreenState extends ConsumerState { return buildProgressIndicator(); } return MangaHomeImageCard( - isManga: source.isManga ?? true, + itemType: source.itemType, manga: _mangaList[index], source: source, isComfortableGrid: isComfortableGrid, @@ -693,14 +694,14 @@ class _MangaHomeScreenState extends ConsumerState { class MangaHomeImageCard extends ConsumerStatefulWidget { final MManga manga; - final bool isManga; + final ItemType itemType; final Source source; final bool isComfortableGrid; const MangaHomeImageCard( {super.key, required this.manga, required this.source, - required this.isManga, + required this.itemType, required this.isComfortableGrid}); @override @@ -716,7 +717,7 @@ class _MangaHomeImageCardState extends ConsumerState return MangaImageCardWidget( getMangaDetail: widget.manga, source: widget.source, - isManga: widget.isManga, + itemType: widget.itemType, isComfortableGrid: widget.isComfortableGrid); } @@ -726,13 +727,13 @@ class _MangaHomeImageCardState extends ConsumerState class MangaHomeImageCardListTile extends ConsumerStatefulWidget { final MManga manga; - final bool isManga; + final ItemType itemType; final Source source; const MangaHomeImageCardListTile( {super.key, required this.manga, required this.source, - required this.isManga}); + required this.itemType}); @override ConsumerState createState() => @@ -749,7 +750,7 @@ class _MangaHomeImageCardListTileState return MangaImageCardListTileWidget( getMangaDetail: widget.manga, source: widget.source, - isManga: widget.isManga); + itemType: widget.itemType); } @override diff --git a/lib/modules/manga/reader/providers/reader_controller_provider.g.dart b/lib/modules/manga/reader/providers/reader_controller_provider.g.dart index 26f6b30..e3a7f52 100644 --- a/lib/modules/manga/reader/providers/reader_controller_provider.g.dart +++ b/lib/modules/manga/reader/providers/reader_controller_provider.g.dart @@ -169,7 +169,7 @@ class _CurrentIndexProviderElement Chapter get chapter => (origin as CurrentIndexProvider).chapter; } -String _$readerControllerHash() => r'cc4f5fbe4192def4d19d9150340d305ba0ecf463'; +String _$readerControllerHash() => r'6576f3506dc5ef309f870de3e5c6e92efe03eefd'; abstract class _$ReaderController extends BuildlessAutoDisposeNotifier { late final Chapter chapter; diff --git a/lib/modules/more/categories/categories_screen.dart b/lib/modules/more/categories/categories_screen.dart index c0262d2..40b0d90 100644 --- a/lib/modules/more/categories/categories_screen.dart +++ b/lib/modules/more/categories/categories_screen.dart @@ -48,6 +48,7 @@ class _CategoriesScreenState extends ConsumerState tabs: [ Tab(text: l10n.manga), Tab(text: l10n.anime), + Tab(text: l10n.novel), ], ), ), @@ -189,7 +190,8 @@ class _CategoriesTabState extends ConsumerState { .notifier) .addDeletedCategoryAsync( _entries[ - index], false); + index], + false); await isar .categorys .delete(_entries[ diff --git a/lib/modules/updates/updates_screen.dart b/lib/modules/updates/updates_screen.dart index f369e2a..028a029 100644 --- a/lib/modules/updates/updates_screen.dart +++ b/lib/modules/updates/updates_screen.dart @@ -42,7 +42,11 @@ class _UpdatesScreenState extends ConsumerState .idIsNotNull() .favoriteEqualTo(true) .and() - .isMangaEqualTo(_tabBarController.index == 0) + .itemTypeEqualTo(_tabBarController.index == 0 + ? ItemType.manga + : _tabBarController.index == 1 + ? ItemType.anime + : ItemType.novel) .findAllSync(); int numbers = 0; @@ -160,10 +164,14 @@ class _UpdatesScreenState extends ConsumerState List updates = isar.updates .filter() .idIsNotNull() - .chapter((q) => q.manga((q) => - q.isMangaEqualTo( - _tabBarController.index == - 0))) + .chapter((q) => q.manga((q) => q + .itemTypeEqualTo(_tabBarController + .index == + 0 + ? ItemType.manga + : _tabBarController.index == 1 + ? ItemType.anime + : ItemType.novel))) .findAllSync() .toList(); isar.writeTxnSync(() { @@ -191,6 +199,7 @@ class _UpdatesScreenState extends ConsumerState tabs: [ Tab(text: l10n.manga), Tab(text: l10n.anime), + Tab(text: l10n.novel), ], ), ), @@ -198,11 +207,15 @@ class _UpdatesScreenState extends ConsumerState padding: const EdgeInsets.only(top: 10), child: TabBarView(controller: _tabBarController, children: [ UpdateTab( - isManga: true, + itemType: ItemType.manga, query: _textEditingController.text, isLoading: _isLoading), UpdateTab( - isManga: false, + itemType: ItemType.anime, + query: _textEditingController.text, + isLoading: _isLoading), + UpdateTab( + itemType: ItemType.novel, query: _textEditingController.text, isLoading: _isLoading) ]), @@ -214,10 +227,10 @@ class _UpdatesScreenState extends ConsumerState class UpdateTab extends ConsumerStatefulWidget { final String query; - final bool isManga; + final ItemType itemType; final bool isLoading; const UpdateTab( - {required this.isManga, + {required this.itemType, required this.query, required this.isLoading, super.key}); @@ -231,7 +244,7 @@ class _UpdateTabState extends ConsumerState { Widget build(BuildContext context) { final l10n = l10nLocalizations(context)!; final update = - ref.watch(getAllUpdateStreamProvider(isManga: widget.isManga)); + ref.watch(getAllUpdateStreamProvider(itemType: widget.itemType)); return Scaffold( body: Stack( children: [ diff --git a/lib/providers/storage_provider.dart b/lib/providers/storage_provider.dart index 6bff6af..8219349 100644 --- a/lib/providers/storage_provider.dart +++ b/lib/providers/storage_provider.dart @@ -83,18 +83,28 @@ class StorageProvider { String scanlator = chapter.scanlator?.isNotEmpty ?? false ? "${chapter.scanlator!.replaceForbiddenCharacters('_')}_" : ""; - final isManga = chapter.manga.value!.isManga!; + final itemType = chapter.manga.value!.itemType; + final itemTypePath = itemType == ItemType.manga + ? "Manga" + : itemType == ItemType.anime + ? "Anime" + : "Novel"; final dir = await getDirectory(); return Directory( - "${dir!.path}/downloads/${isManga ? "Manga" : "Anime"}/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}/"); + "${dir!.path}/downloads/$itemTypePath/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}/"); } Future getMangaMainDirectory(Chapter chapter) async { final manga = chapter.manga.value!; - final isManga = chapter.manga.value!.isManga!; + final itemType = chapter.manga.value!.itemType; + final itemTypePath = itemType == ItemType.manga + ? "Manga" + : itemType == ItemType.anime + ? "Anime" + : "Novel"; final dir = await getDirectory(); return Directory( - "${dir!.path}/downloads/${isManga ? "Manga" : "Anime"}/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/"); + "${dir!.path}/downloads/$itemTypePath/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/"); } Future getDatabaseDirectory() async { From 3d29a12fc486bfd87c4340ea844de1fe9a17725e Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sat, 9 Nov 2024 00:27:11 +0100 Subject: [PATCH 04/18] fix init settings --- lib/models/settings.dart | 47 ++++++++++- .../providers/reader_controller_provider.dart | 82 ++++++++++--------- 2 files changed, 88 insertions(+), 41 deletions(-) diff --git a/lib/models/settings.dart b/lib/models/settings.dart index ba0bc15..01d3c21 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -266,7 +266,7 @@ class Settings { this.animeLibraryShowNumbersOfItems = false, this.animeLibraryShowContinueReadingButton = false, this.animeLibraryLocalSource, - this.sortLibraryAnime, // TODO add novel settings + this.sortLibraryAnime, this.pagePreloadAmount = 6, this.scaleType = ScaleType.fitScreen, this.checkForExtensionUpdates = true, @@ -300,7 +300,19 @@ class Settings { this.mangaGridSize, this.animeGridSize, this.disableSectionType = SectionType.all, - this.useLibass = true}); + this.useLibass = true, + this.libraryFilterNovelDownloadType = 0, + this.libraryFilterNovelUnreadType = 0, + this.libraryFilterNovelStartedType = 0, + this.libraryFilterNovelBookMarkedType = 0, + this.novelLibraryShowCategoryTabs = false, + this.novelLibraryDownloadedChapters = false, + this.novelLibraryShowLanguage = false, + this.novelLibraryShowNumbersOfItems = false, + this.novelLibraryShowContinueReadingButton = false, + this.novelLibraryLocalSource, + this.sortLibraryNovel, + this.novelDisplayType = DisplayType.comfortableGrid}); Settings.fromJson(Map json) { animatePageTransitions = json['animatePageTransitions']; @@ -455,6 +467,22 @@ class Settings { disableSectionType = SectionType.values[json['disableSectionType'] ?? SectionType.all]; useLibass = json['useLibass']; + libraryFilterNovelBookMarkedType = json['libraryFilterNovelBookMarkedType']; + libraryFilterNovelDownloadType = json['libraryFilterNovelDownloadType']; + libraryFilterNovelStartedType = json['libraryFilterNovelStartedType']; + libraryFilterNovelUnreadType = json['libraryFilterNovelUnreadType']; + novelLibraryShowCategoryTabs = json['novelLibraryShowCategoryTabs']; + novelLibraryDownloadedChapters = json['novelLibraryDownloadedChapters']; + novelLibraryShowLanguage = json['novelLibraryShowLanguage']; + novelLibraryShowNumbersOfItems = json['novelLibraryShowNumbersOfItems']; + novelLibraryShowContinueReadingButton = + json['novelLibraryShowContinueReadingButton']; + novelLibraryLocalSource = json['novelLibraryLocalSource']; + sortLibraryNovel = json['sortLibraryNovel'] != null + ? SortLibraryManga.fromJson(json['sortLibraryNovel']) + : null; + novelDisplayType = DisplayType + .values[json['novelDisplayType'] ?? DisplayType.compactGrid.index]; } Map toJson() => { @@ -554,7 +582,20 @@ class Settings { 'mangaGridSize': mangaGridSize, 'animeGridSize': animeGridSize, 'disableSectionType': disableSectionType.index, - 'useLibass': useLibass + 'useLibass': useLibass, + 'libraryFilterNovelBookMarkedType': libraryFilterNovelBookMarkedType, + 'libraryFilterNovelDownloadType': libraryFilterNovelDownloadType, + 'libraryFilterNovelStartedType': libraryFilterNovelStartedType, + 'libraryFilterNovelUnreadType': libraryFilterNovelUnreadType, + 'novelLibraryShowCategoryTabs': novelLibraryShowCategoryTabs, + 'novelLibraryDownloadedChapters': novelLibraryDownloadedChapters, + 'novelLibraryShowLanguage': novelLibraryShowLanguage, + 'novelLibraryShowNumbersOfItems': novelLibraryShowNumbersOfItems, + 'novelLibraryShowContinueReadingButton': + novelLibraryShowContinueReadingButton, + 'novelLibraryLocalSource': novelLibraryLocalSource, + 'sortLibraryNovel': sortLibraryNovel?.toJson(), + 'novelDisplayType': novelDisplayType.index, }; } diff --git a/lib/modules/manga/reader/providers/reader_controller_provider.dart b/lib/modules/manga/reader/providers/reader_controller_provider.dart index 1754680..35b12f5 100644 --- a/lib/modules/manga/reader/providers/reader_controller_provider.dart +++ b/lib/modules/manga/reader/providers/reader_controller_provider.dart @@ -171,7 +171,7 @@ class ReaderController extends _$ReaderController { history = History( mangaId: getManga().id, date: DateTime.now().millisecondsSinceEpoch.toString(), - isManga: getManga().isManga, + itemType: getManga().itemType, chapterId: chapter.id) ..chapter.value = chapter; } else { @@ -379,7 +379,7 @@ extension ChapterExtensions on Chapter { final tracks = isar.tracks .filter() .idIsNotNull() - .isMangaEqualTo(manga.isManga) + .isMangaEqualTo(manga.itemType == ItemType.manga) .mangaIdEqualTo(manga.id!) .findAllSync(); @@ -398,15 +398,17 @@ extension ChapterExtensions on Chapter { track.status = TrackStatus.completed; track.finishedReadingDate = DateTime.now().millisecondsSinceEpoch; } else { - track.status = - manga.isManga! ? TrackStatus.reading : TrackStatus.watching; + track.status = manga.itemType == ItemType.manga + ? TrackStatus.reading + : TrackStatus.watching; if (track.lastChapterRead == 1) { track.startedReadingDate = DateTime.now().millisecondsSinceEpoch; } } } ref - .read(trackStateProvider(track: track, isManga: manga.isManga) + .read(trackStateProvider( + track: track, isManga: manga.itemType == ItemType.manga) .notifier) .updateManga(); } @@ -418,47 +420,51 @@ extension MangaExtensions on Manga { List getFilteredChapterList() { final data = this.chapters.toList().reversed.toList(); final filterUnread = (isar.settings - .getSync(227)! - .chapterFilterUnreadList! - .where((element) => element.mangaId == id) - .toList() - .firstOrNull ?? ChapterFilterUnread( - mangaId: id, - type: 0, - )) + .getSync(227)! + .chapterFilterUnreadList! + .where((element) => element.mangaId == id) + .toList() + .firstOrNull ?? + ChapterFilterUnread( + mangaId: id, + type: 0, + )) .type!; final filterBookmarked = (isar.settings - .getSync(227)! - .chapterFilterBookmarkedList! - .where((element) => element.mangaId == id) - .toList() - .firstOrNull ?? ChapterFilterBookmarked( - mangaId: id, - type: 0, - )) + .getSync(227)! + .chapterFilterBookmarkedList! + .where((element) => element.mangaId == id) + .toList() + .firstOrNull ?? + ChapterFilterBookmarked( + mangaId: id, + type: 0, + )) .type!; final filterDownloaded = (isar.settings - .getSync(227)! - .chapterFilterDownloadedList! - .where((element) => element.mangaId == id) - .toList() - .firstOrNull ?? ChapterFilterDownloaded( - mangaId: id, - type: 0, - )) + .getSync(227)! + .chapterFilterDownloadedList! + .where((element) => element.mangaId == id) + .toList() + .firstOrNull ?? + ChapterFilterDownloaded( + mangaId: id, + type: 0, + )) .type!; final sortChapter = (isar.settings - .getSync(227)! - .sortChapterList! - .where((element) => element.mangaId == id) - .toList() - .firstOrNull ?? SortChapter( - mangaId: id, - index: 1, - reverse: false, - )) + .getSync(227)! + .sortChapterList! + .where((element) => element.mangaId == id) + .toList() + .firstOrNull ?? + SortChapter( + mangaId: id, + index: 1, + reverse: false, + )) .index; final filterScanlator = _getFilterScanlator(this) ?? []; List? chapterList; From fb127f56b597da605fdc8438e5eb69882c746820 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sun, 24 Nov 2024 19:49:57 +0100 Subject: [PATCH 05/18] add novel support --- lib/models/settings.g.dart | 39 ++-- lib/modules/browse/browse_screen.dart | 66 +++++-- .../browse/extension/extension_screen.dart | 39 ++-- .../providers/extensions_provider.dart | 5 +- .../providers/extensions_provider.g.dart | 30 +-- .../browse/sources/sources_screen.dart | 15 +- .../sources/widgets/source_list_tile.dart | 7 +- lib/modules/history/history_screen.dart | 2 +- .../history/providers/isar_providers.g.dart | 4 +- .../library/providers/add_torrent.g.dart | 2 +- .../library/providers/isar_providers.g.dart | 4 +- .../library/providers/local_archive.g.dart | 2 +- lib/modules/main_view/main_screen.dart | 21 +- .../main_view/providers/migration.g.dart | 2 +- .../update_manga_detail_providers.g.dart | 2 +- .../providers/download_provider.g.dart | 2 +- .../more/categories/categories_screen.dart | 2 +- .../providers/isar_providers.g.dart | 2 +- lib/modules/updates/updates_screen.dart | 2 +- lib/services/fetch_novel_sources.dart | 19 ++ lib/services/fetch_novel_sources.g.dart | 179 ++++++++++++++++++ 21 files changed, 349 insertions(+), 97 deletions(-) create mode 100644 lib/services/fetch_novel_sources.dart create mode 100644 lib/services/fetch_novel_sources.g.dart diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index fe10556..e98d9c3 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -1122,6 +1122,10 @@ Settings _settingsDeserialize( libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[53]), libraryFilterMangasStartedType: reader.readLongOrNull(offsets[54]), libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[55]), + libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[56]), + libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[57]), + libraryFilterNovelStartedType: reader.readLongOrNull(offsets[58]), + libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[59]), libraryLocalSource: reader.readBoolOrNull(offsets[60]), libraryShowCategoryTabs: reader.readBoolOrNull(offsets[61]), libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[62]), @@ -1132,6 +1136,15 @@ Settings _settingsDeserialize( reader.readByteOrNull(offsets[67])] ?? DisplayType.comfortableGrid, markEpisodeAsSeenType: reader.readLongOrNull(offsets[68]), + novelDisplayType: _SettingsnovelDisplayTypeValueEnumMap[ + reader.readByteOrNull(offsets[69])] ?? + DisplayType.comfortableGrid, + novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[71]), + novelLibraryLocalSource: reader.readBoolOrNull(offsets[72]), + novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[73]), + novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[74]), + novelLibraryShowLanguage: reader.readBoolOrNull(offsets[75]), + novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[76]), onlyIncludePinnedSources: reader.readBoolOrNull(offsets[77]), pagePreloadAmount: reader.readLongOrNull(offsets[78]), personalPageModeList: reader.readObjectList( @@ -1174,6 +1187,11 @@ Settings _settingsDeserialize( SortLibraryMangaSchema.deserialize, allOffsets, ), + sortLibraryNovel: reader.readObjectOrNull( + offsets[90], + SortLibraryMangaSchema.deserialize, + allOffsets, + ), startDatebackup: reader.readLongOrNull(offsets[91]), syncAfterReading: reader.readBoolOrNull(offsets[92]), syncOnAppLaunch: reader.readBoolOrNull(offsets[93]), @@ -1202,31 +1220,12 @@ 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[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; } @@ -1439,7 +1438,7 @@ P _settingsDeserializeProp

( case 69: return (_SettingsnovelDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? - DisplayType.compactGrid) as P; + DisplayType.comfortableGrid) as P; case 70: return (reader.readLongOrNull(offset)) as P; case 71: diff --git a/lib/modules/browse/browse_screen.dart b/lib/modules/browse/browse_screen.dart index db77540..535aaf5 100644 --- a/lib/modules/browse/browse_screen.dart +++ b/lib/modules/browse/browse_screen.dart @@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/providers/storage_provider.dart'; @@ -75,8 +76,9 @@ class _BrowseScreenState extends ConsumerState ) : Row( children: [ - if (_tabBarController.index == 2 || - _tabBarController.index == 3) + if (_tabBarController.index == 3 || + _tabBarController.index == 4 || + _tabBarController.index == 5) IconButton( onPressed: () { context.push('/createExtension'); @@ -87,8 +89,9 @@ class _BrowseScreenState extends ConsumerState ? IconButton( splashRadius: 20, onPressed: () { - if (_tabBarController.index != 1 && - _tabBarController.index != 0) { + if (_tabBarController.index != 0 && + _tabBarController.index != 1 && + _tabBarController.index != 2) { setState(() { _isSearch = true; }); @@ -101,7 +104,8 @@ class _BrowseScreenState extends ConsumerState }, icon: Icon( _tabBarController.index == 0 || - _tabBarController.index == 1 + _tabBarController.index == 1 || + _tabBarController.index == 2 ? Icons.travel_explore_rounded : Icons.search_rounded, color: Theme.of(context).hintColor)) @@ -116,18 +120,24 @@ class _BrowseScreenState extends ConsumerState } else if (_tabBarController.index == 1) { context.push('/sourceFilter', extra: false); } else if (_tabBarController.index == 2) { - _textEditingController.clear(); - context.push('/ExtensionLang', extra: true); + context.push('/sourceFilter', extra: false); } else if (_tabBarController.index == 3) { _textEditingController.clear(); context.push('/ExtensionLang', extra: false); + } else if (_tabBarController.index == 4) { + _textEditingController.clear(); + context.push('/ExtensionLang', extra: false); + } else if (_tabBarController.index == 5) { + _textEditingController.clear(); + context.push('/ExtensionLang', extra: false); } else {} }, icon: Icon( - _tabBarController.index == 0 || _tabBarController.index == 1 + _tabBarController.index == 0 || _tabBarController.index == 1 || _tabBarController.index == 2 ? Icons.filter_list_sharp - : _tabBarController.index == 2 || - _tabBarController.index == 3 + : _tabBarController.index == 3 || + _tabBarController.index == 4 || + _tabBarController.index == 5 ? Icons.translate_rounded : Icons.help_outline_outlined, color: Theme.of(context).hintColor)), @@ -139,12 +149,13 @@ class _BrowseScreenState extends ConsumerState tabs: [ Tab(text: l10n.manga_sources), Tab(text: l10n.anime_sources), + Tab(text: l10n.novel_sources), Tab( child: Row( children: [ Text(l10n.manga_extensions), const SizedBox(width: 8), - _extensionUpdateNumbers(ref, true) + _extensionUpdateNumbers(ref, ItemType.manga) ], ), ), @@ -153,7 +164,16 @@ class _BrowseScreenState extends ConsumerState children: [ Text(l10n.anime_extensions), const SizedBox(width: 8), - _extensionUpdateNumbers(ref, false) + _extensionUpdateNumbers(ref, ItemType.anime) + ], + ), + ), + Tab( + child: Row( + children: [ + Text(l10n.novel_extensions), + const SizedBox(width: 8), + _extensionUpdateNumbers(ref, ItemType.novel) ], ), ), @@ -163,24 +183,34 @@ class _BrowseScreenState extends ConsumerState ), body: TabBarView(controller: _tabBarController, children: [ SourcesScreen( - isManga: true, + itemType: ItemType.manga, tabIndex: (index) { _tabBarController.animateTo(index); }, ), SourcesScreen( - isManga: false, + itemType: ItemType.anime, + tabIndex: (index) { + _tabBarController.animateTo(index); + }, + ), + SourcesScreen( + itemType: ItemType.novel, tabIndex: (index) { _tabBarController.animateTo(index); }, ), ExtensionScreen( query: _textEditingController.text, - isManga: true, + itemType: ItemType.manga, ), ExtensionScreen( query: _textEditingController.text, - isManga: false, + itemType: ItemType.anime, + ), + ExtensionScreen( + query: _textEditingController.text, + itemType: ItemType.novel, ), // const MigrateScreen() ]), @@ -189,14 +219,14 @@ class _BrowseScreenState extends ConsumerState } } -Widget _extensionUpdateNumbers(WidgetRef ref, bool isManga) { +Widget _extensionUpdateNumbers(WidgetRef ref, ItemType itemType) { return StreamBuilder( stream: isar.sources .filter() .idIsNotNull() .and() .isActiveEqualTo(true) - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .watch(fireImmediately: true), builder: (context, snapshot) { if (snapshot.hasData && snapshot.data!.isNotEmpty) { diff --git a/lib/modules/browse/extension/extension_screen.dart b/lib/modules/browse/extension/extension_screen.dart index b80b963..79a47ad 100644 --- a/lib/modules/browse/extension/extension_screen.dart +++ b/lib/modules/browse/extension/extension_screen.dart @@ -1,21 +1,23 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:grouped_list/sliver_grouped_list.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/modules/browse/extension/providers/extensions_provider.dart'; import 'package:mangayomi/services/fetch_anime_sources.dart'; import 'package:mangayomi/services/fetch_manga_sources.dart'; import 'package:mangayomi/modules/widgets/progress_center.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/services/fetch_novel_sources.dart'; import 'package:mangayomi/services/fetch_sources_list.dart'; import 'package:mangayomi/utils/language.dart'; import 'package:mangayomi/modules/browse/extension/widgets/extension_list_tile_widget.dart'; class ExtensionScreen extends ConsumerStatefulWidget { - final bool isManga; + final ItemType itemType; final String query; const ExtensionScreen( - {required this.query, required this.isManga, super.key}); + {required this.query, required this.itemType, super.key}); @override ConsumerState createState() => _ExtensionScreenState(); @@ -26,19 +28,24 @@ class _ExtensionScreenState extends ConsumerState { @override Widget build(BuildContext context) { final streamExtensions = - ref.watch(getExtensionsStreamProvider(widget.isManga)); - if (widget.isManga) { + ref.watch(getExtensionsStreamProvider(widget.itemType)); + if (widget.itemType == ItemType.manga) { ref.watch(fetchMangaSourcesListProvider(id: null, reFresh: false)); - } else { + } else if (widget.itemType == ItemType.anime) { ref.watch(fetchAnimeSourcesListProvider(id: null, reFresh: false)); + } else { + ref.watch(fetchNovelSourcesListProvider(id: null, reFresh: false)); } final l10n = l10nLocalizations(context)!; return RefreshIndicator( - onRefresh: () => widget.isManga + onRefresh: () => widget.itemType == ItemType.manga ? ref.refresh( fetchMangaSourcesListProvider(id: null, reFresh: true).future) - : ref.refresh( - fetchAnimeSourcesListProvider(id: null, reFresh: true).future), + : widget.itemType == ItemType.anime + ? ref.refresh( + fetchAnimeSourcesListProvider(id: null, reFresh: true).future) : + ref.refresh( + fetchNovelSourcesListProvider(id: null, reFresh: true).future), child: Padding( padding: const EdgeInsets.only(top: 10), child: streamExtensions.when( @@ -87,14 +94,19 @@ class _ExtensionScreenState extends ConsumerState { ElevatedButton( onPressed: () async { for (var source in updateEntries) { - source.isManga! + source.itemType == ItemType.manga ? await ref.watch( fetchMangaSourcesListProvider( id: source.id, reFresh: true) .future) - : await ref.watch( + : source.itemType == ItemType.anime ? + await ref.watch( fetchAnimeSourcesListProvider( id: source.id, reFresh: true) + .future) : + await ref.watch( + fetchNovelSourcesListProvider( + id: source.id, reFresh: true) .future); } }, @@ -167,12 +179,15 @@ class _ExtensionScreenState extends ConsumerState { error: (error, _) => Center( child: ElevatedButton( onPressed: () { - if (widget.isManga) { + if (widget.itemType == ItemType.manga) { ref.invalidate( fetchMangaSourcesListProvider(id: null, reFresh: true)); - } else { + } else if (widget.itemType == ItemType.anime) { ref.invalidate( fetchAnimeSourcesListProvider(id: null, reFresh: true)); + } else { + ref.invalidate( + fetchNovelSourcesListProvider(id: null, reFresh: true)); } }, child: Text(context.l10n.refresh)), diff --git a/lib/modules/browse/extension/providers/extensions_provider.dart b/lib/modules/browse/extension/providers/extensions_provider.dart index 3df2131..c889032 100644 --- a/lib/modules/browse/extension/providers/extensions_provider.dart +++ b/lib/modules/browse/extension/providers/extensions_provider.dart @@ -1,17 +1,18 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'extensions_provider.g.dart'; @riverpod -Stream> getExtensionsStream(Ref ref, bool? isManga) async* { +Stream> getExtensionsStream(Ref ref, ItemType itemType) async* { yield* isar.sources .filter() .idIsNotNull() .and() .isActiveEqualTo(true) - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .watch(fireImmediately: true); } diff --git a/lib/modules/browse/extension/providers/extensions_provider.g.dart b/lib/modules/browse/extension/providers/extensions_provider.g.dart index 2defd2b..555d91b 100644 --- a/lib/modules/browse/extension/providers/extensions_provider.g.dart +++ b/lib/modules/browse/extension/providers/extensions_provider.g.dart @@ -7,7 +7,7 @@ part of 'extensions_provider.dart'; // ************************************************************************** String _$getExtensionsStreamHash() => - r'62f2884dd64a2f3d8928f7399c6b2547f0311078'; + r'3c5d6625c40c222f25fc8141df078dd46bcc762f'; /// Copied from Dart SDK class _SystemHash { @@ -41,10 +41,10 @@ class GetExtensionsStreamFamily extends Family>> { /// See also [getExtensionsStream]. GetExtensionsStreamProvider call( - bool? isManga, + ItemType itemType, ) { return GetExtensionsStreamProvider( - isManga, + itemType, ); } @@ -53,7 +53,7 @@ class GetExtensionsStreamFamily extends Family>> { covariant GetExtensionsStreamProvider provider, ) { return call( - provider.isManga, + provider.itemType, ); } @@ -77,11 +77,11 @@ class GetExtensionsStreamProvider extends AutoDisposeStreamProvider> { /// See also [getExtensionsStream]. GetExtensionsStreamProvider( - bool? isManga, + ItemType itemType, ) : this._internal( (ref) => getExtensionsStream( ref as GetExtensionsStreamRef, - isManga, + itemType, ), from: getExtensionsStreamProvider, name: r'getExtensionsStreamProvider', @@ -92,7 +92,7 @@ class GetExtensionsStreamProvider dependencies: GetExtensionsStreamFamily._dependencies, allTransitiveDependencies: GetExtensionsStreamFamily._allTransitiveDependencies, - isManga: isManga, + itemType: itemType, ); GetExtensionsStreamProvider._internal( @@ -102,10 +102,10 @@ class GetExtensionsStreamProvider 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 GetExtensionsStreamProvider dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - isManga: isManga, + itemType: itemType, ), ); } @@ -132,13 +132,13 @@ class GetExtensionsStreamProvider @override bool operator ==(Object other) { - return other is GetExtensionsStreamProvider && other.isManga == isManga; + return other is GetExtensionsStreamProvider && 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); } @@ -147,8 +147,8 @@ class GetExtensionsStreamProvider @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element mixin GetExtensionsStreamRef on AutoDisposeStreamProviderRef> { - /// The parameter `isManga` of this provider. - bool? get isManga; + /// The parameter `itemType` of this provider. + ItemType get itemType; } class _GetExtensionsStreamProviderElement @@ -157,7 +157,7 @@ class _GetExtensionsStreamProviderElement _GetExtensionsStreamProviderElement(super.provider); @override - bool? get isManga => (origin as GetExtensionsStreamProvider).isManga; + ItemType get itemType => (origin as GetExtensionsStreamProvider).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, deprecated_member_use_from_same_package diff --git a/lib/modules/browse/sources/sources_screen.dart b/lib/modules/browse/sources/sources_screen.dart index 15a8295..0b278a1 100644 --- a/lib/modules/browse/sources/sources_screen.dart +++ b/lib/modules/browse/sources/sources_screen.dart @@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:grouped_list/sliver_grouped_list.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/modules/browse/sources/widgets/source_list_tile.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; @@ -10,9 +11,9 @@ import 'package:mangayomi/utils/language.dart'; class SourcesScreen extends ConsumerStatefulWidget { final Function(int) tabIndex; - final bool isManga; + final ItemType itemType; const SourcesScreen( - {required this.tabIndex, required this.isManga, super.key}); + {required this.tabIndex, required this.itemType, super.key}); @override ConsumerState createState() => _SourcesScreenState(); @@ -33,7 +34,7 @@ class _SourcesScreenState extends ConsumerState { .and() .isActiveEqualTo(true) .and() - .isMangaEqualTo(widget.isManga) + .itemTypeEqualTo(widget.itemType) .watch(fireImmediately: true), builder: (context, snapshot) { if (!snapshot.hasData) { @@ -52,7 +53,7 @@ class _SourcesScreenState extends ConsumerState { padding: const EdgeInsets.all(8.0), child: ElevatedButton.icon( onPressed: () => - widget.tabIndex(widget.isManga ? 2 : 3), + widget.tabIndex(widget.itemType == ItemType.manga ? 3 : widget.itemType == ItemType.anime ? 4 : 5), icon: const Icon(Icons.extension_rounded), label: Text(context.l10n.show_extensions)), ) @@ -91,7 +92,7 @@ class _SourcesScreenState extends ConsumerState { itemBuilder: (context, Source element) { return SourceListTile( source: element, - isManga: widget.isManga, + itemType: widget.itemType, ); }, groupComparator: (group1, group2) => @@ -118,7 +119,7 @@ class _SourcesScreenState extends ConsumerState { itemBuilder: (context, Source element) { return SourceListTile( source: element, - isManga: widget.isManga, + itemType: widget.itemType, ); }, groupComparator: (group1, group2) => @@ -146,7 +147,7 @@ class _SourcesScreenState extends ConsumerState { itemBuilder: (context, Source element) { return SourceListTile( source: element, - isManga: widget.isManga, + itemType: widget.itemType, ); }, groupComparator: (group1, group2) => diff --git a/lib/modules/browse/sources/widgets/source_list_tile.dart b/lib/modules/browse/sources/widgets/source_list_tile.dart index 5cded25..f549ec3 100644 --- a/lib/modules/browse/sources/widgets/source_list_tile.dart +++ b/lib/modules/browse/sources/widgets/source_list_tile.dart @@ -3,6 +3,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/cached_network.dart'; @@ -10,10 +11,10 @@ import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:mangayomi/utils/language.dart'; class SourceListTile extends StatelessWidget { - final bool isManga; + final ItemType itemType; final Source source; const SourceListTile( - {super.key, required this.source, required this.isManga}); + {super.key, required this.source, required this.itemType}); @override Widget build(BuildContext context) { @@ -23,7 +24,7 @@ class SourceListTile extends StatelessWidget { .filter() .idIsNotNull() .and() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .findAllSync(); isar.writeTxnSync(() { for (var src in sources) { diff --git a/lib/modules/history/history_screen.dart b/lib/modules/history/history_screen.dart index bc78e31..db9b326 100644 --- a/lib/modules/history/history_screen.dart +++ b/lib/modules/history/history_screen.dart @@ -34,7 +34,7 @@ class _HistoryScreenState extends ConsumerState @override void initState() { - _tabBarController = TabController(length: 2, vsync: this); + _tabBarController = TabController(length: 3, vsync: this); _tabBarController.animateTo(0); _tabBarController.addListener(() { setState(() { diff --git a/lib/modules/history/providers/isar_providers.g.dart b/lib/modules/history/providers/isar_providers.g.dart index 214f561..f7f4e36 100644 --- a/lib/modules/history/providers/isar_providers.g.dart +++ b/lib/modules/history/providers/isar_providers.g.dart @@ -7,7 +7,7 @@ part of 'isar_providers.dart'; // ************************************************************************** String _$getAllHistoryStreamHash() => - r'53b3a7837efab9e7d2808930e5070dbd788c59f8'; + r'42048cb03035be55b52fc501fb2309cdb2acfcb8'; /// Copied from Dart SDK class _SystemHash { @@ -161,7 +161,7 @@ class _GetAllHistoryStreamProviderElement } String _$getAllUpdateStreamHash() => - r'01f77807c8be11f471b6acee6e7bc358ce600a65'; + r'6a20f8feba3010c2ab7a80560f7a7f6cf10c7366'; /// See also [getAllUpdateStream]. @ProviderFor(getAllUpdateStream) diff --git a/lib/modules/library/providers/add_torrent.g.dart b/lib/modules/library/providers/add_torrent.g.dart index 3abd477..47af35c 100644 --- a/lib/modules/library/providers/add_torrent.g.dart +++ b/lib/modules/library/providers/add_torrent.g.dart @@ -7,7 +7,7 @@ part of 'add_torrent.dart'; // ************************************************************************** String _$addTorrentFromUrlOrFromFileHash() => - r'8102259b30765a5c5cc57870f5c583bd5d421eee'; + r'11cc239bb8b517326f9a005b0c89dd5eb1127099'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/library/providers/isar_providers.g.dart b/lib/modules/library/providers/isar_providers.g.dart index 226add7..6f13f7a 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'1c0b5442ae86b2fa899d509a555f5d375f0ff79a'; +String _$getAllMangaStreamHash() => r'5e86a22a68ca1a52aefa9c0bc675d284369beac5'; /// Copied from Dart SDK class _SystemHash { @@ -176,7 +176,7 @@ class _GetAllMangaStreamProviderElement } String _$getAllMangaWithoutCategoriesStreamHash() => - r'78076f291274b7defd9567e55314002d9aeecab1'; + r'61ea54070c7e87a45aeabce5fd21366faaf4ae6d'; /// See also [getAllMangaWithoutCategoriesStream]. @ProviderFor(getAllMangaWithoutCategoriesStream) diff --git a/lib/modules/library/providers/local_archive.g.dart b/lib/modules/library/providers/local_archive.g.dart index 1344db9..842e199 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'8be95f0947ab5247e3305a355a6f17f0aaecad00'; + r'8e6e592c927ad080e93d54dac1144ef8637a7e52'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/main_view/main_screen.dart b/lib/modules/main_view/main_screen.dart index e19a484..cac7be4 100644 --- a/lib/modules/main_view/main_screen.dart +++ b/lib/modules/main_view/main_screen.dart @@ -43,10 +43,10 @@ class MainScreen extends ConsumerWidget { int currentIndex = switch (location) { null || '/MangaLibrary' => 0, '/AnimeLibrary' => 1, - '/updates' => 2, - '/history' => 3, - '/browse' => 4, - '/NovelLibrary' => 5, + '/NovelLibrary' => 2, + '/updates' => 3, + '/history' => 4, + '/browse' => 5, _ => 6, }; @@ -259,6 +259,12 @@ class MainScreen extends ConsumerWidget { icon: const Icon( Icons.video_collection_outlined), label: l10n.anime), + NavigationDestination( + selectedIcon: + const Icon(Icons.local_library), + icon: const Icon( + Icons.local_library_outlined), + label: l10n.novel), Stack( children: [ NavigationDestination( @@ -298,9 +304,10 @@ class MainScreen extends ConsumerWidget { final fn = switch (newIndex) { 0 => route.go('/MangaLibrary'), 1 => route.go('/AnimeLibrary'), - 2 => route.go('/updates'), - 3 => route.go('/history'), - 4 => route.go('/browse'), + 2 => route.go('/NovelLibrary'), + 3 => route.go('/updates'), + 4 => route.go('/history'), + 5 => route.go('/browse'), _ => route.go('/more'), }; fn; diff --git a/lib/modules/main_view/providers/migration.g.dart b/lib/modules/main_view/providers/migration.g.dart index f67f692..5b40519 100644 --- a/lib/modules/main_view/providers/migration.g.dart +++ b/lib/modules/main_view/providers/migration.g.dart @@ -6,7 +6,7 @@ part of 'migration.dart'; // RiverpodGenerator // ************************************************************************** -String _$migrationHash() => r'a302c6da3c1545c952a28e76a6d0b7af3fde1e7a'; +String _$migrationHash() => r'403da626b6a797854dde7ae77b4ea452300c40e6'; /// See also [migration]. @ProviderFor(migration) diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index 22fa5a6..a51d9b2 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'29a10d49454febb4fe88ca9c007d3512d812bf84'; +String _$updateMangaDetailHash() => r'a058dcca7f99974e89fce2aa7f048edf1a0f7854'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/download/providers/download_provider.g.dart b/lib/modules/manga/download/providers/download_provider.g.dart index a2d2734..73729de 100644 --- a/lib/modules/manga/download/providers/download_provider.g.dart +++ b/lib/modules/manga/download/providers/download_provider.g.dart @@ -6,7 +6,7 @@ part of 'download_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$downloadChapterHash() => r'f407f5839eff9754f9590f2f2189bcb604f3fa06'; +String _$downloadChapterHash() => r'0c9c5baacb970a0f8b105212a4e420e759a38fda'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/more/categories/categories_screen.dart b/lib/modules/more/categories/categories_screen.dart index 40b0d90..52d4236 100644 --- a/lib/modules/more/categories/categories_screen.dart +++ b/lib/modules/more/categories/categories_screen.dart @@ -22,7 +22,7 @@ class _CategoriesScreenState extends ConsumerState late TabController _tabBarController; @override void initState() { - _tabBarController = TabController(length: 2, vsync: this); + _tabBarController = TabController(length: 3, vsync: this); _tabBarController.animateTo(widget.data.$2); super.initState(); diff --git a/lib/modules/more/categories/providers/isar_providers.g.dart b/lib/modules/more/categories/providers/isar_providers.g.dart index 64e02f1..8306984 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'97e90977f4696eedcf597c655a40dd6ccd47ed37'; + r'1dcf15018a6467eef7a26c1728b9e531ebd984d0'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/updates/updates_screen.dart b/lib/modules/updates/updates_screen.dart index 028a029..c26403b 100644 --- a/lib/modules/updates/updates_screen.dart +++ b/lib/modules/updates/updates_screen.dart @@ -72,7 +72,7 @@ class _UpdatesScreenState extends ConsumerState @override void initState() { - _tabBarController = TabController(length: 2, vsync: this); + _tabBarController = TabController(length: 3, vsync: this); _tabBarController.animateTo(0); _tabBarController.addListener(() { setState(() { diff --git a/lib/services/fetch_novel_sources.dart b/lib/services/fetch_novel_sources.dart new file mode 100644 index 0000000..1a020ae --- /dev/null +++ b/lib/services/fetch_novel_sources.dart @@ -0,0 +1,19 @@ +import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; +import 'package:mangayomi/services/fetch_sources_list.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +part 'fetch_novel_sources.g.dart'; + +@riverpod +Future fetchNovelSourcesList(Ref ref, + {int? id, required reFresh}) async { + if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) { + await fetchSourcesList( + sourcesIndexUrl: + "https://kodjodevf.github.io/mangayomi-extensions/index.json", + refresh: reFresh, + id: id, + ref: ref, + isManga: true); + } +} diff --git a/lib/services/fetch_novel_sources.g.dart b/lib/services/fetch_novel_sources.g.dart new file mode 100644 index 0000000..a4b70ba --- /dev/null +++ b/lib/services/fetch_novel_sources.g.dart @@ -0,0 +1,179 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'fetch_novel_sources.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$fetchNovelSourcesListHash() => + r'110b23568136e32ebfba7e5414bdf524881a8579'; + +/// Copied from Dart SDK +class _SystemHash { + _SystemHash._(); + + static int combine(int hash, int value) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + value); + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); + return hash ^ (hash >> 6); + } + + static int finish(int hash) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); + // ignore: parameter_assignments + hash = hash ^ (hash >> 11); + return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); + } +} + +/// See also [fetchNovelSourcesList]. +@ProviderFor(fetchNovelSourcesList) +const fetchNovelSourcesListProvider = FetchNovelSourcesListFamily(); + +/// See also [fetchNovelSourcesList]. +class FetchNovelSourcesListFamily extends Family { + /// See also [fetchNovelSourcesList]. + const FetchNovelSourcesListFamily(); + + /// See also [fetchNovelSourcesList]. + FetchNovelSourcesListProvider call({ + int? id, + required dynamic reFresh, + }) { + return FetchNovelSourcesListProvider( + id: id, + reFresh: reFresh, + ); + } + + @override + FetchNovelSourcesListProvider getProviderOverride( + covariant FetchNovelSourcesListProvider provider, + ) { + return call( + id: provider.id, + reFresh: provider.reFresh, + ); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'fetchNovelSourcesListProvider'; +} + +/// See also [fetchNovelSourcesList]. +class FetchNovelSourcesListProvider extends AutoDisposeFutureProvider { + /// See also [fetchNovelSourcesList]. + FetchNovelSourcesListProvider({ + int? id, + required dynamic reFresh, + }) : this._internal( + (ref) => fetchNovelSourcesList( + ref as FetchNovelSourcesListRef, + id: id, + reFresh: reFresh, + ), + from: fetchNovelSourcesListProvider, + name: r'fetchNovelSourcesListProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$fetchNovelSourcesListHash, + dependencies: FetchNovelSourcesListFamily._dependencies, + allTransitiveDependencies: + FetchNovelSourcesListFamily._allTransitiveDependencies, + id: id, + reFresh: reFresh, + ); + + FetchNovelSourcesListProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.id, + required this.reFresh, + }) : super.internal(); + + final int? id; + final dynamic reFresh; + + @override + Override overrideWith( + FutureOr Function(FetchNovelSourcesListRef provider) create, + ) { + return ProviderOverride( + origin: this, + override: FetchNovelSourcesListProvider._internal( + (ref) => create(ref as FetchNovelSourcesListRef), + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + id: id, + reFresh: reFresh, + ), + ); + } + + @override + AutoDisposeFutureProviderElement createElement() { + return _FetchNovelSourcesListProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is FetchNovelSourcesListProvider && + other.id == id && + other.reFresh == reFresh; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, id.hashCode); + hash = _SystemHash.combine(hash, reFresh.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin FetchNovelSourcesListRef on AutoDisposeFutureProviderRef { + /// The parameter `id` of this provider. + int? get id; + + /// The parameter `reFresh` of this provider. + dynamic get reFresh; +} + +class _FetchNovelSourcesListProviderElement + extends AutoDisposeFutureProviderElement + with FetchNovelSourcesListRef { + _FetchNovelSourcesListProviderElement(super.provider); + + @override + int? get id => (origin as FetchNovelSourcesListProvider).id; + @override + dynamic get reFresh => (origin as FetchNovelSourcesListProvider).reFresh; +} +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package From 161750f5dcac6c4d477745e1d27988a1eee03bad Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Wed, 27 Nov 2024 23:51:54 +0100 Subject: [PATCH 06/18] add novel support --- lib/modules/browse/browse_screen.dart | 4 ++-- lib/services/fetch_anime_sources.dart | 3 ++- lib/services/fetch_manga_sources.dart | 3 ++- lib/services/fetch_novel_sources.dart | 6 ++++-- lib/services/fetch_novel_sources.g.dart | 2 +- lib/services/fetch_sources_list.dart | 17 +++++++++-------- 6 files changed, 20 insertions(+), 15 deletions(-) diff --git a/lib/modules/browse/browse_screen.dart b/lib/modules/browse/browse_screen.dart index 535aaf5..5ad7d43 100644 --- a/lib/modules/browse/browse_screen.dart +++ b/lib/modules/browse/browse_screen.dart @@ -25,7 +25,7 @@ class _BrowseScreenState extends ConsumerState @override void initState() { - _tabBarController = TabController(length: 4, vsync: this); + _tabBarController = TabController(length: 6, vsync: this); _tabBarController.animateTo(0); _tabBarController.addListener(() { _chekPermission(); @@ -48,7 +48,7 @@ class _BrowseScreenState extends ConsumerState final l10n = l10nLocalizations(context)!; return DefaultTabController( animationDuration: Duration.zero, - length: 4, + length: 6, child: Scaffold( appBar: AppBar( elevation: 0, diff --git a/lib/services/fetch_anime_sources.dart b/lib/services/fetch_anime_sources.dart index bef157b..574b143 100644 --- a/lib/services/fetch_anime_sources.dart +++ b/lib/services/fetch_anime_sources.dart @@ -1,3 +1,4 @@ +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; import 'package:mangayomi/services/fetch_sources_list.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -13,6 +14,6 @@ Future fetchAnimeSourcesList(Ref ref, {int? id, required bool reFresh}) async { refresh: reFresh, id: id, ref: ref, - isManga: false); + itemType: ItemType.anime); } } diff --git a/lib/services/fetch_manga_sources.dart b/lib/services/fetch_manga_sources.dart index 0c050b0..d623676 100644 --- a/lib/services/fetch_manga_sources.dart +++ b/lib/services/fetch_manga_sources.dart @@ -1,3 +1,4 @@ +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; import 'package:mangayomi/services/fetch_sources_list.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -14,6 +15,6 @@ Future fetchMangaSourcesList(Ref ref, refresh: reFresh, id: id, ref: ref, - isManga: true); + itemType: ItemType.manga); } } diff --git a/lib/services/fetch_novel_sources.dart b/lib/services/fetch_novel_sources.dart index 1a020ae..a37c892 100644 --- a/lib/services/fetch_novel_sources.dart +++ b/lib/services/fetch_novel_sources.dart @@ -1,3 +1,4 @@ +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; import 'package:mangayomi/services/fetch_sources_list.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -8,12 +9,13 @@ part 'fetch_novel_sources.g.dart'; Future fetchNovelSourcesList(Ref ref, {int? id, required reFresh}) async { if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) { + return; await fetchSourcesList( sourcesIndexUrl: - "https://kodjodevf.github.io/mangayomi-extensions/index.json", + "https://kodjodevf.github.io/mangayomi-extensions/novel_index.json", refresh: reFresh, id: id, ref: ref, - isManga: true); + itemType: ItemType.novel); } } diff --git a/lib/services/fetch_novel_sources.g.dart b/lib/services/fetch_novel_sources.g.dart index a4b70ba..c234f06 100644 --- a/lib/services/fetch_novel_sources.g.dart +++ b/lib/services/fetch_novel_sources.g.dart @@ -7,7 +7,7 @@ part of 'fetch_novel_sources.dart'; // ************************************************************************** String _$fetchNovelSourcesListHash() => - r'110b23568136e32ebfba7e5414bdf524881a8579'; + r'464573fff74edd4bf1f0bf36eb9ad44ef38accfc'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/fetch_sources_list.dart b/lib/services/fetch_sources_list.dart index 933e86a..53a8cd9 100644 --- a/lib/services/fetch_sources_list.dart +++ b/lib/services/fetch_sources_list.dart @@ -4,6 +4,7 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/eval/dart/service.dart'; import 'package:mangayomi/eval/javascript/service.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/modules/more/settings/browse/providers/browse_state_provider.dart'; import 'package:mangayomi/services/http/m_client.dart'; @@ -14,7 +15,7 @@ Future fetchSourcesList( required bool refresh, required String sourcesIndexUrl, required Ref ref, - required bool isManga}) async { + required ItemType itemType}) async { final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); final req = await http.get(Uri.parse(sourcesIndexUrl)); @@ -26,7 +27,7 @@ Future fetchSourcesList( for (var source in sourceList) { if (source.appMinVerReq != null) { if (compareVersions(info.version, source.appMinVerReq!) > -1) { - if ((source.isManga ?? true) == isManga) { + if (source.itemType == itemType || (!source.isManga! && itemType == ItemType.anime)) { if (id != null) { if (id == source.id) { final sourc = isar.sources.getSync(id)!; @@ -51,7 +52,7 @@ Future fetchSourcesList( ..name = source.name ..version = source.version ..versionLast = source.version - ..isManga = source.isManga + ..itemType = itemType ..isFullData = source.isFullData ?? false ..appMinVerReq = source.appMinVerReq ..sourceCodeLanguage = source.sourceCodeLanguage @@ -90,7 +91,7 @@ Future fetchSourcesList( ..name = source.name ..version = source.version ..versionLast = source.version - ..isManga = source.isManga + ..itemType = itemType ..isFullData = source.isFullData ?? false ..appMinVerReq = source.appMinVerReq ..sourceCodeLanguage = source.sourceCodeLanguage @@ -120,7 +121,7 @@ Future fetchSourcesList( ..name = source.name ..version = source.version ..versionLast = source.version - ..isManga = source.isManga + ..itemType = itemType ..sourceCodeLanguage = source.sourceCodeLanguage ..isFullData = source.isFullData ?? false ..appMinVerReq = source.appMinVerReq @@ -132,14 +133,14 @@ Future fetchSourcesList( } } }); - checkIfSourceIsObsolete(sourceList, isManga); + checkIfSourceIsObsolete(sourceList, itemType); } -void checkIfSourceIsObsolete(List sourceList, bool isManga) { +void checkIfSourceIsObsolete(List sourceList, ItemType itemType) { for (var source in isar.sources .filter() .idIsNotNull() - .isMangaEqualTo(isManga) + .itemTypeEqualTo(itemType) .findAllSync()) { if (sourceList.isNotEmpty && !(source.isLocal ?? false)) { final ids = From d46d30a30b2c80f95d4d119b3d3455d7231e512a Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 2 Dec 2024 23:04:52 +0100 Subject: [PATCH 07/18] add novel support --- .../extension/widgets/create_extension.dart | 41 +++++++++++++++---- .../widgets/extension_list_tile_widget.dart | 26 ++++++++---- lib/services/fetch_anime_sources.g.dart | 2 +- lib/services/fetch_manga_sources.g.dart | 2 +- lib/services/fetch_novel_sources.dart | 3 +- lib/services/fetch_novel_sources.g.dart | 2 +- 6 files changed, 55 insertions(+), 21 deletions(-) diff --git a/lib/modules/browse/extension/widgets/create_extension.dart b/lib/modules/browse/extension/widgets/create_extension.dart index 76cdf63..316f161 100644 --- a/lib/modules/browse/extension/widgets/create_extension.dart +++ b/lib/modules/browse/extension/widgets/create_extension.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:mangayomi/eval/dart/model/m_bridge.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; @@ -13,15 +14,16 @@ class CreateExtension extends StatefulWidget { } class _CreateExtensionState extends State { - bool _isManga = false; String _name = ""; String _lang = ""; String _baseUrl = ""; String _apiUrl = ""; String _iconUrl = ""; int _sourceTypeIndex = 0; + int _itemTypeIndex = 0; int _languageIndex = 0; final List _sourceTypes = ["single", "multi", "torrent"]; + final List _itemTypes = ["Manga", "Anime", "Novel"]; final List _languages = ["Dart", "JavaScript"]; SourceCodeLanguage _sourceCodeLanguage = SourceCodeLanguage.dart; @override @@ -129,12 +131,35 @@ class _CreateExtensionState extends State { ], ), ), - SwitchListTile( - title: const Text("isManga"), - value: _isManga, - onChanged: (value) => setState(() { - _isManga = value; - }), + Padding( + padding: const EdgeInsets.symmetric(horizontal: 17), + child: Row( + children: [ + const Text("Target"), + const SizedBox(width: 20), + Flexible( + child: DropdownButton( + icon: const Icon(Icons.keyboard_arrow_down), + isExpanded: true, + value: _itemTypeIndex, + hint: Text(_itemTypes[_itemTypeIndex], + style: const TextStyle(fontSize: 13)), + items: _itemTypes + .map((e) => DropdownMenuItem( + value: _itemTypes.indexOf(e), + child: Text(e, + style: const TextStyle(fontSize: 13)), + )) + .toList(), + onChanged: (v) { + setState(() { + _itemTypeIndex = v!; + }); + }, + ), + ), + ], + ), ), Padding( padding: const EdgeInsets.all(8.0), @@ -159,7 +184,7 @@ class _CreateExtensionState extends State { apiUrl: _apiUrl, iconUrl: _iconUrl, typeSource: _sourceTypes[_sourceTypeIndex], - isManga: _isManga, + itemType: ItemType.values.elementAt(_itemTypeIndex), isAdded: true, isActive: true, version: "0.0.1", diff --git a/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart b/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart index 816fa10..c1ed5af 100644 --- a/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart +++ b/lib/modules/browse/extension/widgets/extension_list_tile_widget.dart @@ -2,10 +2,12 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:go_router/go_router.dart'; import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/services/fetch_anime_sources.dart'; import 'package:mangayomi/services/fetch_manga_sources.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/services/fetch_novel_sources.dart'; import 'package:mangayomi/services/fetch_sources_list.dart'; import 'package:mangayomi/utils/cached_network.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; @@ -48,13 +50,17 @@ class _ExtensionListTileWidgetState setState(() { _isLoading = true; }); - widget.source.isManga! + widget.source.itemType == ItemType.manga ? await ref.watch(fetchMangaSourcesListProvider( id: widget.source.id, reFresh: true) .future) - : await ref.watch(fetchAnimeSourcesListProvider( - id: widget.source.id, reFresh: true) - .future); + : widget.source.itemType == ItemType.anime + ? await ref.watch(fetchAnimeSourcesListProvider( + id: widget.source.id, reFresh: true) + .future) + : await ref.watch(fetchNovelSourcesListProvider( + id: widget.source.id, reFresh: true) + .future); if (mounted) { setState(() { _isLoading = false; @@ -115,13 +121,17 @@ class _ExtensionListTileWidgetState setState(() { _isLoading = true; }); - widget.source.isManga! + widget.source.itemType == ItemType.manga ? await ref.watch(fetchMangaSourcesListProvider( id: widget.source.id, reFresh: true) .future) - : await ref.watch(fetchAnimeSourcesListProvider( - id: widget.source.id, reFresh: true) - .future); + : widget.source.itemType == ItemType.anime + ? await ref.watch(fetchAnimeSourcesListProvider( + id: widget.source.id, reFresh: true) + .future) + : await ref.watch(fetchNovelSourcesListProvider( + id: widget.source.id, reFresh: true) + .future); if (mounted) { setState(() { _isLoading = false; diff --git a/lib/services/fetch_anime_sources.g.dart b/lib/services/fetch_anime_sources.g.dart index 4a80780..3c1c4e6 100644 --- a/lib/services/fetch_anime_sources.g.dart +++ b/lib/services/fetch_anime_sources.g.dart @@ -7,7 +7,7 @@ part of 'fetch_anime_sources.dart'; // ************************************************************************** String _$fetchAnimeSourcesListHash() => - r'8fbe1642aee4d475583a1f04b2d236984c6fcfb4'; + r'75185e008e90491987fabb55851c536de89653a4'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/fetch_manga_sources.g.dart b/lib/services/fetch_manga_sources.g.dart index 44c0863..6bf219e 100644 --- a/lib/services/fetch_manga_sources.g.dart +++ b/lib/services/fetch_manga_sources.g.dart @@ -7,7 +7,7 @@ part of 'fetch_manga_sources.dart'; // ************************************************************************** String _$fetchMangaSourcesListHash() => - r'8bc08c334cfdba887227c154e249355f33e69da4'; + r'f66f3011e72a3b234d7729ef203fc5f255870db3'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/fetch_novel_sources.dart b/lib/services/fetch_novel_sources.dart index a37c892..ae9b6c9 100644 --- a/lib/services/fetch_novel_sources.dart +++ b/lib/services/fetch_novel_sources.dart @@ -9,10 +9,9 @@ part 'fetch_novel_sources.g.dart'; Future fetchNovelSourcesList(Ref ref, {int? id, required reFresh}) async { if (ref.watch(checkForExtensionsUpdateStateProvider) || reFresh) { - return; await fetchSourcesList( sourcesIndexUrl: - "https://kodjodevf.github.io/mangayomi-extensions/novel_index.json", + "https://raw.githubusercontent.com/Schnitzel5/mangayomi-extensions/refs/heads/main/novel_index.json", refresh: reFresh, id: id, ref: ref, diff --git a/lib/services/fetch_novel_sources.g.dart b/lib/services/fetch_novel_sources.g.dart index c234f06..c212a85 100644 --- a/lib/services/fetch_novel_sources.g.dart +++ b/lib/services/fetch_novel_sources.g.dart @@ -7,7 +7,7 @@ part of 'fetch_novel_sources.dart'; // ************************************************************************** String _$fetchNovelSourcesListHash() => - r'464573fff74edd4bf1f0bf36eb9ad44ef38accfc'; + r'cc4b989c0248c3b16155444c0c429d1ed0025ecb'; /// Copied from Dart SDK class _SystemHash { From f054a1fd94233c304bc0c9faa33b9672b813e8a2 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sun, 8 Dec 2024 22:55:14 +0100 Subject: [PATCH 08/18] small fix --- lib/modules/library/providers/library_state_provider.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/modules/library/providers/library_state_provider.dart b/lib/modules/library/providers/library_state_provider.dart index e44cbee..93d2e77 100644 --- a/lib/modules/library/providers/library_state_provider.dart +++ b/lib/modules/library/providers/library_state_provider.dart @@ -575,9 +575,9 @@ class LibraryLocalSourceState extends _$LibraryLocalSourceState { bool build({required ItemType itemType, required Settings settings}) { switch (itemType) { case ItemType.manga: - return settings.libraryLocalSource!; + return settings.libraryLocalSource ?? false; case ItemType.anime: - return settings.animeLibraryLocalSource!; + return settings.animeLibraryLocalSource ?? false; default: return settings.novelLibraryLocalSource ?? false; } From 62f378f5eeb5a9f8427e81ff74a078107f42a383 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Tue, 10 Dec 2024 00:01:54 +0100 Subject: [PATCH 09/18] added novel reader view --- lib/models/settings.g.dart | 338 ++- .../providers/library_state_provider.g.dart | 2 +- .../widgets/library_gridview_widget.dart | 2 +- .../novel_reader_controller_provider.dart | 370 +++ .../novel_reader_controller_provider.g.dart | 177 ++ lib/modules/novel/novel_reader_view.dart | 2056 +---------------- lib/router/router.dart | 4 +- lib/services/aniskip.g.dart | 2 +- lib/services/trackers/anilist.g.dart | 2 +- pubspec.lock | 24 +- pubspec.yaml | 1 + 11 files changed, 815 insertions(+), 2163 deletions(-) create mode 100644 lib/modules/novel/novel_reader_controller_provider.dart create mode 100644 lib/modules/novel/novel_reader_controller_provider.g.dart diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index a7b9b55..daa0845 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -317,209 +317,229 @@ const SettingsSchema = CollectionSchema( name: r'libraryFilterMangasUnreadType', type: IsarType.long, ), - r'libraryLocalSource': PropertySchema( + r'libraryFilterNovelBookMarkedType': PropertySchema( id: 57, + name: r'libraryFilterNovelBookMarkedType', + type: IsarType.long, + ), + r'libraryFilterNovelDownloadType': PropertySchema( + id: 58, + name: r'libraryFilterNovelDownloadType', + type: IsarType.long, + ), + r'libraryFilterNovelStartedType': PropertySchema( + id: 59, + name: r'libraryFilterNovelStartedType', + type: IsarType.long, + ), + r'libraryFilterNovelUnreadType': PropertySchema( + id: 60, + name: r'libraryFilterNovelUnreadType', + type: IsarType.long, + ), + r'libraryLocalSource': PropertySchema( + id: 61, name: r'libraryLocalSource', type: IsarType.bool, ), r'libraryShowCategoryTabs': PropertySchema( - id: 58, + id: 62, name: r'libraryShowCategoryTabs', type: IsarType.bool, ), r'libraryShowContinueReadingButton': PropertySchema( - id: 59, + id: 63, name: r'libraryShowContinueReadingButton', type: IsarType.bool, ), r'libraryShowLanguage': PropertySchema( - id: 60, + id: 64, name: r'libraryShowLanguage', type: IsarType.bool, ), r'libraryShowNumbersOfItems': PropertySchema( - id: 61, + id: 65, name: r'libraryShowNumbersOfItems', type: IsarType.bool, ), r'locale': PropertySchema( - id: 62, + id: 66, name: r'locale', type: IsarType.object, target: r'L10nLocale', ), r'mangaGridSize': PropertySchema( - id: 63, + id: 67, name: r'mangaGridSize', type: IsarType.long, ), r'mangaHomeDisplayType': PropertySchema( - id: 64, + id: 68, name: r'mangaHomeDisplayType', type: IsarType.byte, enumMap: _SettingsmangaHomeDisplayTypeEnumValueMap, ), r'markEpisodeAsSeenType': PropertySchema( - id: 65, + id: 69, name: r'markEpisodeAsSeenType', type: IsarType.long, ), r'novelDisplayType': PropertySchema( - id: 69, + id: 70, name: r'novelDisplayType', type: IsarType.byte, enumMap: _SettingsnovelDisplayTypeEnumValueMap, ), r'novelGridSize': PropertySchema( - id: 70, + id: 71, name: r'novelGridSize', type: IsarType.long, ), r'novelLibraryDownloadedChapters': PropertySchema( - id: 71, + id: 72, name: r'novelLibraryDownloadedChapters', type: IsarType.bool, ), r'novelLibraryLocalSource': PropertySchema( - id: 72, + id: 73, name: r'novelLibraryLocalSource', type: IsarType.bool, ), r'novelLibraryShowCategoryTabs': PropertySchema( - id: 73, + id: 74, name: r'novelLibraryShowCategoryTabs', type: IsarType.bool, ), r'novelLibraryShowContinueReadingButton': PropertySchema( - id: 74, + id: 75, name: r'novelLibraryShowContinueReadingButton', type: IsarType.bool, ), r'novelLibraryShowLanguage': PropertySchema( - id: 75, + id: 76, name: r'novelLibraryShowLanguage', type: IsarType.bool, ), r'novelLibraryShowNumbersOfItems': PropertySchema( - id: 76, + id: 77, name: r'novelLibraryShowNumbersOfItems', type: IsarType.bool, ), r'onlyIncludePinnedSources': PropertySchema( - id: 66, + id: 78, name: r'onlyIncludePinnedSources', type: IsarType.bool, ), r'pagePreloadAmount': PropertySchema( - id: 67, + id: 79, name: r'pagePreloadAmount', type: IsarType.long, ), r'personalPageModeList': PropertySchema( - id: 68, + id: 80, name: r'personalPageModeList', type: IsarType.objectList, target: r'PersonalPageMode', ), r'personalReaderModeList': PropertySchema( - id: 69, + id: 81, name: r'personalReaderModeList', type: IsarType.objectList, target: r'PersonalReaderMode', ), r'playerSubtitleSettings': PropertySchema( - id: 70, + id: 82, name: r'playerSubtitleSettings', type: IsarType.object, target: r'PlayerSubtitleSettings', ), r'pureBlackDarkMode': PropertySchema( - id: 71, + id: 83, name: r'pureBlackDarkMode', type: IsarType.bool, ), r'relativeTimesTamps': PropertySchema( - id: 72, + id: 84, name: r'relativeTimesTamps', type: IsarType.long, ), r'saveAsCBZArchive': PropertySchema( - id: 73, + id: 85, name: r'saveAsCBZArchive', type: IsarType.bool, ), r'scaleType': PropertySchema( - id: 74, + id: 86, name: r'scaleType', type: IsarType.byte, enumMap: _SettingsscaleTypeEnumValueMap, ), r'showPagesNumber': PropertySchema( - id: 75, + id: 87, name: r'showPagesNumber', type: IsarType.bool, ), r'sortChapterList': PropertySchema( - id: 76, + id: 88, name: r'sortChapterList', type: IsarType.objectList, target: r'SortChapter', ), r'sortLibraryAnime': PropertySchema( - id: 77, + id: 89, name: r'sortLibraryAnime', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryManga': PropertySchema( - id: 78, + id: 90, name: r'sortLibraryManga', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryNovel': PropertySchema( - id: 90, + id: 91, name: r'sortLibraryNovel', type: IsarType.object, target: r'SortLibraryManga', ), r'startDatebackup': PropertySchema( - id: 79, + id: 92, name: r'startDatebackup', type: IsarType.long, ), r'syncAfterReading': PropertySchema( - id: 80, + id: 93, name: r'syncAfterReading', type: IsarType.bool, ), r'syncOnAppLaunch': PropertySchema( - id: 81, + id: 94, name: r'syncOnAppLaunch', type: IsarType.bool, ), r'themeIsDark': PropertySchema( - id: 82, + id: 95, name: r'themeIsDark', type: IsarType.bool, ), r'updateProgressAfterReading': PropertySchema( - id: 83, + id: 96, name: r'updateProgressAfterReading', type: IsarType.bool, ), r'useLibass': PropertySchema( - id: 84, + id: 97, name: r'useLibass', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( - id: 85, + id: 98, name: r'usePageTapZones', type: IsarType.bool, ), r'userAgent': PropertySchema( - id: 86, + id: 99, name: r'userAgent', type: IsarType.string, ) @@ -921,71 +941,89 @@ void _settingsSerialize( writer.writeLong(offsets[54], object.libraryFilterMangasDownloadType); writer.writeLong(offsets[55], object.libraryFilterMangasStartedType); writer.writeLong(offsets[56], object.libraryFilterMangasUnreadType); - writer.writeBool(offsets[57], object.libraryLocalSource); - writer.writeBool(offsets[58], object.libraryShowCategoryTabs); - writer.writeBool(offsets[59], object.libraryShowContinueReadingButton); - writer.writeBool(offsets[60], object.libraryShowLanguage); - writer.writeBool(offsets[61], object.libraryShowNumbersOfItems); + writer.writeLong(offsets[57], object.libraryFilterNovelBookMarkedType); + writer.writeLong(offsets[58], object.libraryFilterNovelDownloadType); + writer.writeLong(offsets[59], object.libraryFilterNovelStartedType); + writer.writeLong(offsets[60], object.libraryFilterNovelUnreadType); + writer.writeBool(offsets[61], object.libraryLocalSource); + writer.writeBool(offsets[62], object.libraryShowCategoryTabs); + writer.writeBool(offsets[63], object.libraryShowContinueReadingButton); + writer.writeBool(offsets[64], object.libraryShowLanguage); + writer.writeBool(offsets[65], object.libraryShowNumbersOfItems); writer.writeObject( - offsets[62], + offsets[66], allOffsets, L10nLocaleSchema.serialize, object.locale, ); - writer.writeLong(offsets[63], object.mangaGridSize); - writer.writeByte(offsets[64], object.mangaHomeDisplayType.index); - writer.writeLong(offsets[65], object.markEpisodeAsSeenType); - writer.writeBool(offsets[66], object.onlyIncludePinnedSources); - writer.writeLong(offsets[67], object.pagePreloadAmount); + writer.writeLong(offsets[67], object.mangaGridSize); + writer.writeByte(offsets[68], object.mangaHomeDisplayType.index); + writer.writeLong(offsets[69], object.markEpisodeAsSeenType); + writer.writeByte(offsets[70], object.novelDisplayType.index); + writer.writeLong(offsets[71], object.novelGridSize); + writer.writeBool(offsets[72], object.novelLibraryDownloadedChapters); + writer.writeBool(offsets[73], object.novelLibraryLocalSource); + writer.writeBool(offsets[74], object.novelLibraryShowCategoryTabs); + writer.writeBool(offsets[75], object.novelLibraryShowContinueReadingButton); + writer.writeBool(offsets[76], object.novelLibraryShowLanguage); + writer.writeBool(offsets[77], object.novelLibraryShowNumbersOfItems); + writer.writeBool(offsets[78], object.onlyIncludePinnedSources); + writer.writeLong(offsets[79], object.pagePreloadAmount); writer.writeObjectList( - offsets[68], + offsets[80], allOffsets, PersonalPageModeSchema.serialize, object.personalPageModeList, ); writer.writeObjectList( - offsets[69], + offsets[81], allOffsets, PersonalReaderModeSchema.serialize, object.personalReaderModeList, ); writer.writeObject( - offsets[70], + offsets[82], allOffsets, PlayerSubtitleSettingsSchema.serialize, object.playerSubtitleSettings, ); - writer.writeBool(offsets[71], object.pureBlackDarkMode); - writer.writeLong(offsets[72], object.relativeTimesTamps); - writer.writeBool(offsets[73], object.saveAsCBZArchive); - writer.writeByte(offsets[74], object.scaleType.index); - writer.writeBool(offsets[75], object.showPagesNumber); + writer.writeBool(offsets[83], object.pureBlackDarkMode); + writer.writeLong(offsets[84], object.relativeTimesTamps); + writer.writeBool(offsets[85], object.saveAsCBZArchive); + writer.writeByte(offsets[86], object.scaleType.index); + writer.writeBool(offsets[87], object.showPagesNumber); writer.writeObjectList( - offsets[76], + offsets[88], allOffsets, SortChapterSchema.serialize, object.sortChapterList, ); writer.writeObject( - offsets[77], + offsets[89], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryAnime, ); writer.writeObject( - offsets[78], + offsets[90], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryManga, ); - writer.writeLong(offsets[79], object.startDatebackup); - writer.writeBool(offsets[80], object.syncAfterReading); - writer.writeBool(offsets[81], object.syncOnAppLaunch); - writer.writeBool(offsets[82], object.themeIsDark); - writer.writeBool(offsets[83], object.updateProgressAfterReading); - writer.writeBool(offsets[84], object.useLibass); - writer.writeBool(offsets[85], object.usePageTapZones); - writer.writeString(offsets[86], object.userAgent); + writer.writeObject( + offsets[91], + allOffsets, + SortLibraryMangaSchema.serialize, + object.sortLibraryNovel, + ); + writer.writeLong(offsets[92], object.startDatebackup); + writer.writeBool(offsets[93], object.syncAfterReading); + writer.writeBool(offsets[94], object.syncOnAppLaunch); + writer.writeBool(offsets[95], object.themeIsDark); + writer.writeBool(offsets[96], object.updateProgressAfterReading); + writer.writeBool(offsets[97], object.useLibass); + writer.writeBool(offsets[98], object.usePageTapZones); + writer.writeString(offsets[99], object.userAgent); } Settings _settingsDeserialize( @@ -1091,66 +1129,84 @@ Settings _settingsDeserialize( libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[54]), libraryFilterMangasStartedType: reader.readLongOrNull(offsets[55]), libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[56]), - libraryLocalSource: reader.readBoolOrNull(offsets[57]), - libraryShowCategoryTabs: reader.readBoolOrNull(offsets[58]), - libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[59]), - libraryShowLanguage: reader.readBoolOrNull(offsets[60]), - libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[61]), - mangaGridSize: reader.readLongOrNull(offsets[63]), + libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[57]), + libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[58]), + libraryFilterNovelStartedType: reader.readLongOrNull(offsets[59]), + libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[60]), + libraryLocalSource: reader.readBoolOrNull(offsets[61]), + libraryShowCategoryTabs: reader.readBoolOrNull(offsets[62]), + libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[63]), + libraryShowLanguage: reader.readBoolOrNull(offsets[64]), + libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[65]), + mangaGridSize: reader.readLongOrNull(offsets[67]), mangaHomeDisplayType: _SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[64])] ?? + reader.readByteOrNull(offsets[68])] ?? DisplayType.comfortableGrid, - markEpisodeAsSeenType: reader.readLongOrNull(offsets[65]), - onlyIncludePinnedSources: reader.readBoolOrNull(offsets[66]), - pagePreloadAmount: reader.readLongOrNull(offsets[67]), + markEpisodeAsSeenType: reader.readLongOrNull(offsets[69]), + novelDisplayType: _SettingsnovelDisplayTypeValueEnumMap[ + reader.readByteOrNull(offsets[70])] ?? + DisplayType.comfortableGrid, + novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[72]), + novelLibraryLocalSource: reader.readBoolOrNull(offsets[73]), + novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[74]), + novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[75]), + novelLibraryShowLanguage: reader.readBoolOrNull(offsets[76]), + novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[77]), + onlyIncludePinnedSources: reader.readBoolOrNull(offsets[78]), + pagePreloadAmount: reader.readLongOrNull(offsets[79]), personalPageModeList: reader.readObjectList( - offsets[68], + offsets[80], PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), ), personalReaderModeList: reader.readObjectList( - offsets[69], + offsets[81], PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), ), playerSubtitleSettings: reader.readObjectOrNull( - offsets[70], + offsets[82], PlayerSubtitleSettingsSchema.deserialize, allOffsets, ), - pureBlackDarkMode: reader.readBoolOrNull(offsets[71]), - relativeTimesTamps: reader.readLongOrNull(offsets[72]), - saveAsCBZArchive: reader.readBoolOrNull(offsets[73]), + pureBlackDarkMode: reader.readBoolOrNull(offsets[83]), + relativeTimesTamps: reader.readLongOrNull(offsets[84]), + saveAsCBZArchive: reader.readBoolOrNull(offsets[85]), scaleType: - _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[74])] ?? + _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[86])] ?? ScaleType.fitScreen, - showPagesNumber: reader.readBoolOrNull(offsets[75]), + showPagesNumber: reader.readBoolOrNull(offsets[87]), sortChapterList: reader.readObjectList( - offsets[76], + offsets[88], SortChapterSchema.deserialize, allOffsets, SortChapter(), ), sortLibraryAnime: reader.readObjectOrNull( - offsets[77], + offsets[89], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryManga: reader.readObjectOrNull( - offsets[78], + offsets[90], SortLibraryMangaSchema.deserialize, allOffsets, ), - startDatebackup: reader.readLongOrNull(offsets[79]), - syncAfterReading: reader.readBoolOrNull(offsets[80]), - syncOnAppLaunch: reader.readBoolOrNull(offsets[81]), - themeIsDark: reader.readBoolOrNull(offsets[82]), - updateProgressAfterReading: reader.readBoolOrNull(offsets[83]), - useLibass: reader.readBoolOrNull(offsets[84]), - usePageTapZones: reader.readBoolOrNull(offsets[85]), - userAgent: reader.readStringOrNull(offsets[86]), + sortLibraryNovel: reader.readObjectOrNull( + offsets[91], + SortLibraryMangaSchema.deserialize, + allOffsets, + ), + startDatebackup: reader.readLongOrNull(offsets[92]), + syncAfterReading: reader.readBoolOrNull(offsets[93]), + syncOnAppLaunch: reader.readBoolOrNull(offsets[94]), + themeIsDark: reader.readBoolOrNull(offsets[95]), + updateProgressAfterReading: reader.readBoolOrNull(offsets[96]), + useLibass: reader.readBoolOrNull(offsets[97]), + usePageTapZones: reader.readBoolOrNull(offsets[98]), + userAgent: reader.readStringOrNull(offsets[99]), ); object.chapterFilterBookmarkedList = reader.readObjectList( @@ -1172,11 +1228,11 @@ Settings _settingsDeserialize( FilterScanlator(), ); object.locale = reader.readObjectOrNull( - offsets[62], + offsets[66], L10nLocaleSchema.deserialize, allOffsets, ); - object.novelGridSize = reader.readLongOrNull(offsets[70]); + object.novelGridSize = reader.readLongOrNull(offsets[71]); return object; } @@ -1363,80 +1419,112 @@ P _settingsDeserializeProp

( case 59: return (reader.readLongOrNull(offset)) as P; case 60: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(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.readBoolOrNull(offset)) as P; + case 66: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 63: - return (reader.readLongOrNull(offset)) as P; - case 64: - return (_SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offset)] ?? - DisplayType.comfortableGrid) as P; - case 65: - return (reader.readLongOrNull(offset)) as P; - case 66: - return (reader.readBoolOrNull(offset)) as P; case 67: return (reader.readLongOrNull(offset)) as P; case 68: + return (_SettingsmangaHomeDisplayTypeValueEnumMap[ + reader.readByteOrNull(offset)] ?? + DisplayType.comfortableGrid) as P; + case 69: + return (reader.readLongOrNull(offset)) as P; + case 70: + return (_SettingsnovelDisplayTypeValueEnumMap[ + reader.readByteOrNull(offset)] ?? + DisplayType.comfortableGrid) as P; + case 71: + return (reader.readLongOrNull(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.readBoolOrNull(offset)) as P; + case 79: + return (reader.readLongOrNull(offset)) as P; + case 80: return (reader.readObjectList( offset, PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), )) as P; - case 69: + case 81: return (reader.readObjectList( offset, PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), )) as P; - case 70: + case 82: return (reader.readObjectOrNull( offset, PlayerSubtitleSettingsSchema.deserialize, allOffsets, )) as P; - case 71: + case 83: return (reader.readBoolOrNull(offset)) as P; - case 72: + case 84: return (reader.readLongOrNull(offset)) as P; - case 73: + case 85: return (reader.readBoolOrNull(offset)) as P; - case 74: + case 86: return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? ScaleType.fitScreen) as P; - case 75: + case 87: return (reader.readBoolOrNull(offset)) as P; - case 76: + case 88: return (reader.readObjectList( offset, SortChapterSchema.deserialize, allOffsets, SortChapter(), )) 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 79: + case 91: + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; + case 92: return (reader.readLongOrNull(offset)) as P; - case 80: + case 93: return (reader.readBoolOrNull(offset)) as P; case 94: return (reader.readBoolOrNull(offset)) as P; @@ -1446,9 +1534,9 @@ P _settingsDeserializeProp

( return (reader.readBoolOrNull(offset)) as P; case 97: return (reader.readBoolOrNull(offset)) as P; - case 85: + case 98: return (reader.readBoolOrNull(offset)) as P; - case 86: + case 99: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); diff --git a/lib/modules/library/providers/library_state_provider.g.dart b/lib/modules/library/providers/library_state_provider.g.dart index 11da2b5..cc1c77a 100644 --- a/lib/modules/library/providers/library_state_provider.g.dart +++ b/lib/modules/library/providers/library_state_provider.g.dart @@ -1824,7 +1824,7 @@ class _LibraryLanguageStateProviderElement } String _$libraryLocalSourceStateHash() => - r'356648df45deac415cd5ce34e920ebe1fdc7a648'; + r'f3a442394bd9ecbe9be574f6843b9aca4310bdf3'; abstract class _$LibraryLocalSourceState extends BuildlessAutoDisposeNotifier { diff --git a/lib/modules/library/widgets/library_gridview_widget.dart b/lib/modules/library/widgets/library_gridview_widget.dart index e9c6212..7dfa0e0 100644 --- a/lib/modules/library/widgets/library_gridview_widget.dart +++ b/lib/modules/library/widgets/library_gridview_widget.dart @@ -279,7 +279,7 @@ class _LibraryGridViewWidgetState extends State { .idIsNotNull() .and() .chapter((q) => q.manga((q) => - q.itemTypeEqualTo(entry.itemType!))) + q.itemTypeEqualTo(entry.itemType))) .watch(fireImmediately: true), builder: (context, snapshot) { if (snapshot.hasData && diff --git a/lib/modules/novel/novel_reader_controller_provider.dart b/lib/modules/novel/novel_reader_controller_provider.dart new file mode 100644 index 0000000..68347ec --- /dev/null +++ b/lib/modules/novel/novel_reader_controller_provider.dart @@ -0,0 +1,370 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:isar/isar.dart'; +import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/chapter.dart'; +import 'package:mangayomi/models/download.dart'; +import 'package:mangayomi/models/history.dart'; +import 'package:mangayomi/models/manga.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:mangayomi/models/track.dart'; +import 'package:mangayomi/models/track_preference.dart'; +import 'package:mangayomi/modules/manga/detail/providers/track_state_providers.dart'; +import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; +import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; +import 'package:mangayomi/services/sync_server.dart'; +import 'package:mangayomi/utils/chapter_recognition.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +part 'novel_reader_controller_provider.g.dart'; + +BoxFit getBoxFit(ScaleType scaleType) { + return switch (scaleType) { + ScaleType.fitHeight => BoxFit.fitHeight, + ScaleType.fitWidth => BoxFit.fitWidth, + ScaleType.fitScreen => BoxFit.contain, + ScaleType.originalSize => BoxFit.cover, + ScaleType.smartFit => BoxFit.contain, + _ => BoxFit.cover + }; +} + +@riverpod +class NovelReaderController extends _$NovelReaderController { + @override + void build({required Chapter chapter}) {} + + Manga getManga() { + return chapter.manga.value!; + } + + Chapter geChapter() { + return chapter; + } + + final incognitoMode = isar.settings.getSync(227)!.incognitoMode!; + + Settings getIsarSetting() { + return isar.settings.getSync(227)!; + } + + void setMangaHistoryUpdate() { + if (incognitoMode) return; + isar.writeTxnSync(() { + Manga? manga = chapter.manga.value; + manga!.lastRead = DateTime.now().millisecondsSinceEpoch; + isar.mangas.putSync(manga); + }); + History? history; + + final empty = + isar.historys.filter().mangaIdEqualTo(getManga().id).isEmptySync(); + + if (empty) { + history = History( + mangaId: getManga().id, + date: DateTime.now().millisecondsSinceEpoch.toString(), + itemType: getManga().itemType, + chapterId: chapter.id) + ..chapter.value = chapter; + } else { + history = (isar.historys + .filter() + .mangaIdEqualTo(getManga().id) + .findFirstSync())! + ..chapterId = chapter.id + ..chapter.value = chapter + ..date = DateTime.now().millisecondsSinceEpoch.toString(); + } + isar.writeTxnSync(() { + isar.historys.putSync(history!); + history.chapter.saveSync(); + }); + } + + void checkAndSyncProgress() { + final syncAfterReading = ref.watch(syncAfterReadingStateProvider); + if (syncAfterReading) { + ref.read(syncServerProvider(syncId: 1).notifier).checkForSync(true); + } + } + + void setChapterBookmarked() { + if (incognitoMode) return; + final isBookmarked = getChapterBookmarked(); + final chap = chapter; + isar.writeTxnSync(() { + chap.isBookmarked = !isBookmarked; + ref + .read(changedItemsManagerProvider(managerId: 1).notifier) + .addUpdatedChapter(chap, false, false); + isar.chapters.putSync(chap); + }); + } + + bool getChapterBookmarked() { + return isar.chapters.getSync(chapter.id!)!.isBookmarked!; + } + + (int, bool) getPrevChapterIndex() { + final chapters = getManga().getFilteredChapterList(); + int? index; + for (var i = 0; i < chapters.length; i++) { + if (chapters[i].id == chapter.id) { + index = i + 1; + } + } + if (index == null) { + final chapters = getManga().chapters.toList().reversed.toList(); + for (var i = 0; i < chapters.length; i++) { + if (chapters[i].id == chapter.id) { + index = i + 1; + } + } + return (index!, false); + } + return (index, true); + } + + (int, bool) getNextChapterIndex() { + final chapters = getManga().getFilteredChapterList(); + int? index; + for (var i = 0; i < chapters.length; i++) { + if (chapters[i].id == chapter.id) { + index = i - 1; + } + } + if (index == null) { + final chapters = getManga().chapters.toList().reversed.toList(); + for (var i = 0; i < chapters.length; i++) { + if (chapters[i].id == chapter.id) { + index = i - 1; + } + } + return (index!, false); + } + return (index, true); + } + + (int, bool) getChapterIndex() { + final chapters = getManga().getFilteredChapterList(); + int? index; + for (var i = 0; i < chapters.length; i++) { + if (chapters[i].id == chapter.id) { + index = i; + } + } + if (index == null) { + final chapters = getManga().chapters.toList().reversed.toList(); + for (var i = 0; i < chapters.length; i++) { + if (chapters[i].id == chapter.id) { + index = i; + } + } + return (index!, false); + } + return (index, true); + } + + Chapter getPrevChapter() { + final prevChapIdx = getPrevChapterIndex(); + return prevChapIdx.$2 + ? getManga().getFilteredChapterList()[prevChapIdx.$1] + : getManga().chapters.toList().reversed.toList()[prevChapIdx.$1]; + } + + Chapter getNextChapter() { + final nextChapIdx = getNextChapterIndex(); + return nextChapIdx.$2 + ? getManga().getFilteredChapterList()[nextChapIdx.$1] + : getManga().chapters.toList().reversed.toList()[nextChapIdx.$1]; + } + + int getChaptersLength(bool isInFilterList) { + return isInFilterList + ? getManga().getFilteredChapterList().length + : getManga().chapters.length; + } + + String getMangaName() { + return getManga().name!; + } + + String getSourceName() { + return getManga().source!; + } + + String getChapterTitle() { + return chapter.name!; + } +} + +extension ChapterExtensions on Chapter { + void updateTrackChapterRead(dynamic ref) { + if (!(ref is WidgetRef || ref is Ref)) return; + final updateProgressAfterReading = + ref.watch(updateProgressAfterReadingStateProvider); + if (!updateProgressAfterReading) return; + final manga = this.manga.value!; + final chapterNumber = + ChapterRecognition().parseChapterNumber(manga.name!, name!); + + final tracks = isar.tracks + .filter() + .idIsNotNull() + .isMangaEqualTo(manga.itemType == ItemType.manga) + .mangaIdEqualTo(manga.id!) + .findAllSync(); + + if (tracks.isEmpty) return; + for (var track in tracks) { + final service = isar.trackPreferences + .filter() + .syncIdIsNotNull() + .syncIdEqualTo(track.syncId) + .findFirstSync(); + if (!(service == null || chapterNumber <= (track.lastChapterRead ?? 0))) { + if (track.status != TrackStatus.completed) { + track.lastChapterRead = chapterNumber; + if (track.lastChapterRead == track.totalChapter && + (track.totalChapter ?? 0) > 0) { + track.status = TrackStatus.completed; + track.finishedReadingDate = DateTime.now().millisecondsSinceEpoch; + } else { + track.status = manga.itemType == ItemType.manga + ? TrackStatus.reading + : TrackStatus.watching; + if (track.lastChapterRead == 1) { + track.startedReadingDate = DateTime.now().millisecondsSinceEpoch; + } + } + } + ref + .read(trackStateProvider( + track: track, isManga: manga.itemType == ItemType.manga) + .notifier) + .updateManga(); + } + } + } +} + +extension MangaExtensions on Manga { + List getFilteredChapterList() { + final data = this.chapters.toList().reversed.toList(); + final filterUnread = (isar.settings + .getSync(227)! + .chapterFilterUnreadList! + .where((element) => element.mangaId == id) + .toList() + .firstOrNull ?? + ChapterFilterUnread( + mangaId: id, + type: 0, + )) + .type!; + + final filterBookmarked = (isar.settings + .getSync(227)! + .chapterFilterBookmarkedList! + .where((element) => element.mangaId == id) + .toList() + .firstOrNull ?? + ChapterFilterBookmarked( + mangaId: id, + type: 0, + )) + .type!; + final filterDownloaded = (isar.settings + .getSync(227)! + .chapterFilterDownloadedList! + .where((element) => element.mangaId == id) + .toList() + .firstOrNull ?? + ChapterFilterDownloaded( + mangaId: id, + type: 0, + )) + .type!; + + final sortChapter = (isar.settings + .getSync(227)! + .sortChapterList! + .where((element) => element.mangaId == id) + .toList() + .firstOrNull ?? + SortChapter( + mangaId: id, + index: 1, + reverse: false, + )) + .index; + final filterScanlator = _getFilterScanlator(this) ?? []; + List? chapterList; + chapterList = data + .where((element) => filterUnread == 1 + ? element.isRead == false + : filterUnread == 2 + ? element.isRead == true + : true) + .where((element) => filterBookmarked == 1 + ? element.isBookmarked == true + : filterBookmarked == 2 + ? element.isBookmarked == false + : true) + .where((element) { + final modelChapDownload = isar.downloads + .filter() + .idIsNotNull() + .chapterIdEqualTo(element.id) + .findAllSync(); + return filterDownloaded == 1 + ? modelChapDownload.isNotEmpty && + modelChapDownload.first.isDownload == true + : filterDownloaded == 2 + ? !(modelChapDownload.isNotEmpty && + modelChapDownload.first.isDownload == true) + : true; + }) + .where((element) => !filterScanlator.contains(element.scanlator)) + .toList(); + List chapters = + sortChapter == 1 ? chapterList.reversed.toList() : chapterList; + if (sortChapter == 0) { + chapters.sort( + (a, b) { + return (a.scanlator == null || + b.scanlator == null || + a.dateUpload == null || + b.dateUpload == null) + ? 0 + : a.scanlator!.compareTo(b.scanlator!) | + a.dateUpload!.compareTo(b.dateUpload!); + }, + ); + } else if (sortChapter == 2) { + chapters.sort( + (a, b) { + return (a.dateUpload == null || b.dateUpload == null) + ? 0 + : int.parse(a.dateUpload!).compareTo(int.parse(b.dateUpload!)); + }, + ); + } else if (sortChapter == 3) { + chapters.sort( + (a, b) { + return (a.name == null || b.name == null) + ? 0 + : a.name!.compareTo(b.name!); + }, + ); + } + return chapterList; + } +} + +List? _getFilterScanlator(Manga manga) { + final scanlators = isar.settings.getSync(227)!.filterScanlatorList ?? []; + final filter = + scanlators.where((element) => element.mangaId == manga.id).toList(); + return filter.firstOrNull?.scanlators; +} diff --git a/lib/modules/novel/novel_reader_controller_provider.g.dart b/lib/modules/novel/novel_reader_controller_provider.g.dart new file mode 100644 index 0000000..b32e177 --- /dev/null +++ b/lib/modules/novel/novel_reader_controller_provider.g.dart @@ -0,0 +1,177 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'novel_reader_controller_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$novelReaderControllerHash() => + r'74ebbf38d60283d308646b59cfd5cfee07c85535'; + +/// Copied from Dart SDK +class _SystemHash { + _SystemHash._(); + + static int combine(int hash, int value) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + value); + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); + return hash ^ (hash >> 6); + } + + static int finish(int hash) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); + // ignore: parameter_assignments + hash = hash ^ (hash >> 11); + return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); + } +} + +abstract class _$NovelReaderController + extends BuildlessAutoDisposeNotifier { + late final Chapter chapter; + + void build({ + required Chapter chapter, + }); +} + +/// See also [NovelReaderController]. +@ProviderFor(NovelReaderController) +const novelReaderControllerProvider = NovelReaderControllerFamily(); + +/// See also [NovelReaderController]. +class NovelReaderControllerFamily extends Family { + /// See also [NovelReaderController]. + const NovelReaderControllerFamily(); + + /// See also [NovelReaderController]. + NovelReaderControllerProvider call({ + required Chapter chapter, + }) { + return NovelReaderControllerProvider( + chapter: chapter, + ); + } + + @override + NovelReaderControllerProvider getProviderOverride( + covariant NovelReaderControllerProvider provider, + ) { + return call( + chapter: provider.chapter, + ); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'novelReaderControllerProvider'; +} + +/// See also [NovelReaderController]. +class NovelReaderControllerProvider + extends AutoDisposeNotifierProviderImpl { + /// See also [NovelReaderController]. + NovelReaderControllerProvider({ + required Chapter chapter, + }) : this._internal( + () => NovelReaderController()..chapter = chapter, + from: novelReaderControllerProvider, + name: r'novelReaderControllerProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$novelReaderControllerHash, + dependencies: NovelReaderControllerFamily._dependencies, + allTransitiveDependencies: + NovelReaderControllerFamily._allTransitiveDependencies, + chapter: chapter, + ); + + NovelReaderControllerProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.chapter, + }) : super.internal(); + + final Chapter chapter; + + @override + void runNotifierBuild( + covariant NovelReaderController notifier, + ) { + return notifier.build( + chapter: chapter, + ); + } + + @override + Override overrideWith(NovelReaderController Function() create) { + return ProviderOverride( + origin: this, + override: NovelReaderControllerProvider._internal( + () => create()..chapter = chapter, + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + chapter: chapter, + ), + ); + } + + @override + AutoDisposeNotifierProviderElement + createElement() { + return _NovelReaderControllerProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is NovelReaderControllerProvider && other.chapter == chapter; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, chapter.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin NovelReaderControllerRef on AutoDisposeNotifierProviderRef { + /// The parameter `chapter` of this provider. + Chapter get chapter; +} + +class _NovelReaderControllerProviderElement + extends AutoDisposeNotifierProviderElement + with NovelReaderControllerRef { + _NovelReaderControllerProviderElement(super.provider); + + @override + Chapter get chapter => (origin as NovelReaderControllerProvider).chapter; +} +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/lib/modules/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart index c4dc4c9..a0cae39 100644 --- a/lib/modules/novel/novel_reader_view.dart +++ b/lib/modules/novel/novel_reader_view.dart @@ -1,50 +1,26 @@ -/* import 'dart:async'; -import 'dart:math'; +import 'dart:async'; 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'; +import 'package:flutter_html/flutter_html.dart'; typedef DoubleClickAnimationListener = void Function(); @@ -57,87 +33,31 @@ class NovelReaderView extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final chapterData = ref.watch(getChapterPagesProvider( + ref.watch(getChapterPagesProvider( chapter: chapter, - )); + )); // TODO fetch html body content - 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(), - ); - }, - ); + return NovelWebView(chapter: chapter); } } -class MangaChapterPageGallery extends ConsumerStatefulWidget { - const MangaChapterPageGallery({ +class NovelWebView extends ConsumerStatefulWidget { + const NovelWebView({ super.key, required this.chapter, - required this.chapterUrlModel, }); - final GetChapterPagesModel chapterUrlModel; final Chapter chapter; @override ConsumerState createState() { - return _MangaChapterPageGalleryState(); + return _NovelWebViewState(); } } -class _MangaChapterPageGalleryState - extends ConsumerState +class _NovelWebViewState extends ConsumerState with TickerProviderStateMixin { - late AnimationController _scaleAnimationController; - late Animation _animation; - late ReaderController _readerController = + late final ReaderController _readerController = ref.read(readerControllerProvider(chapter: chapter).notifier); bool isDesktop = Platform.isMacOS || Platform.isLinux || Platform.isWindows; @@ -145,10 +65,7 @@ class _MangaChapterPageGalleryState void dispose() { _readerController.setMangaHistoryUpdate(); _readerController.checkAndSyncProgress(); - _readerController.setPageIndex( - _geCurrentIndex(_uChapDataPreload[_currentIndex!].index!), true); _rebuildDetail.close(); - _doubleClickAnimationController.dispose(); _autoScroll.value = false; clearGestureDetailsCache(); if (isDesktop) { @@ -162,82 +79,26 @@ class _MangaChapterPageGalleryState 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); @@ -250,148 +111,10 @@ class _MangaChapterPageGalleryState 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, @@ -416,26 +139,6 @@ class _MangaChapterPageGalleryState (!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) || @@ -470,825 +173,36 @@ class _MangaChapterPageGalleryState _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() - ], - ); - }), + child: Column( + children: [ + Expanded( + child: SingleChildScrollView( + child: Html( + data: """""", + style: { + "*": Style( + backgroundColor: Colors.white, + margin: Margins.all(5)) + }, + shrinkWrap: true, + ), + ), + ), + _appBar(), + ], + ), ), ), ), ); } - 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); @@ -1399,425 +313,6 @@ class _MangaChapterPageGalleryState ); } - 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) { @@ -1834,500 +329,6 @@ class _MangaChapterPageGalleryState } } } - - 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 { @@ -2421,4 +422,3 @@ class CustomPopupMenuButton extends StatelessWidget { ); } } - */ \ No newline at end of file diff --git a/lib/router/router.dart b/lib/router/router.dart index 59c4263..f5199a7 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -236,7 +236,7 @@ class RouterNotifier extends ChangeNotifier { ); }, ), - /*GoRoute( + GoRoute( path: "/novelReaderView", name: "novelReaderView", builder: (context, state) { @@ -254,7 +254,7 @@ class RouterNotifier extends ChangeNotifier { ), ); }, - ),*/ + ), GoRoute( path: "/ExtensionLang", name: "ExtensionLang", diff --git a/lib/services/aniskip.g.dart b/lib/services/aniskip.g.dart index b2e1def..c05db92 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'887869b54e2e151633efd46da83bde845e14f421'; +String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c'; /// See also [AniSkip]. @ProviderFor(AniSkip) diff --git a/lib/services/trackers/anilist.g.dart b/lib/services/trackers/anilist.g.dart index ea4d0e9..dd740dc 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'87784b25bccf5b1c61d6c7494f0569a28494dd8b'; +String _$anilistHash() => r'd3a8852d689b13c3bde46ec05b464e7779149e58'; /// Copied from Dart SDK class _SystemHash { diff --git a/pubspec.lock b/pubspec.lock index 5a544c1..6a73d01 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -258,10 +258,10 @@ packages: dependency: transitive description: name: csslib - sha256: "09bad715f418841f976c77db72d5398dc1253c21fb9c0c7f0b0b985860b2d58e" + sha256: "831883fb353c8bdc1d71979e5b342c7d88acfbc643113c14ae51e2442ea0f20f" url: "https://pub.dev" source: hosted - version: "1.0.2" + version: "0.17.3" cupertino_icons: dependency: "direct main" description: @@ -484,6 +484,14 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.0" + flutter_html: + dependency: "direct main" + description: + name: flutter_html + sha256: "02ad69e813ecfc0728a455e4bf892b9379983e050722b1dce00192ee2e41d1ee" + url: "https://pub.dev" + source: hosted + version: "3.0.0-beta.2" flutter_inappwebview: dependency: "direct main" description: @@ -720,10 +728,10 @@ packages: dependency: "direct main" description: name: html - sha256: "1fc58edeaec4307368c60d59b7e15b9d658b57d7f3125098b6294153c75337ec" + sha256: "3a7812d5bcd2894edf53dfaf8cd640876cf6cef50a8f238745c8b8120ea74d3a" url: "https://pub.dev" source: hosted - version: "0.15.5" + version: "0.15.4" http: dependency: "direct main" description: @@ -916,6 +924,14 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + list_counter: + dependency: transitive + description: + name: list_counter + sha256: c447ae3dfcd1c55f0152867090e67e219d42fe6d4f2807db4bbe8b8d69912237 + url: "https://pub.dev" + source: hosted + version: "1.0.2" logging: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index ab87133..85cac6e 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -73,6 +73,7 @@ dependencies: url: https://github.com/kodjodevf/desktop_webview_window.git path: packages/desktop_webview_window ref: main + flutter_html: ^3.0.0-beta.2 dependency_overrides: http: ^1.2.1 From 50eff04fe6576b6fbef843659320a4b25f3fad2f Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Fri, 20 Dec 2024 00:22:18 +0100 Subject: [PATCH 10/18] added extension functions --- lib/eval/dart/bridge/m_provider.dart | 11 ++ lib/eval/dart/model/m_provider.dart | 2 + lib/eval/dart/service.dart | 4 + lib/eval/javascript/service.dart | 8 + lib/modules/browse/extension/edit_code.dart | 20 +- .../extension/widgets/create_extension.dart | 10 + lib/modules/novel/novel_reader_view.dart | 36 ++-- lib/services/get_html_content.dart | 21 +++ lib/services/get_html_content.g.dart | 177 ++++++++++++++++++ pubspec.lock | 162 ++++++++-------- 10 files changed, 351 insertions(+), 100 deletions(-) create mode 100644 lib/services/get_html_content.dart create mode 100644 lib/services/get_html_content.g.dart diff --git a/lib/eval/dart/bridge/m_provider.dart b/lib/eval/dart/bridge/m_provider.dart index 814cda2..b36d627 100644 --- a/lib/eval/dart/bridge/m_provider.dart +++ b/lib/eval/dart/bridge/m_provider.dart @@ -98,6 +98,13 @@ class $MProvider extends MProvider with $Bridge { BridgeParameter('url', BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false), ])), + 'getHtmlContent': BridgeMethodDef(BridgeFunctionDef( + returns: BridgeTypeAnnotation(BridgeTypeRef( + CoreTypes.future, [BridgeTypeRef(CoreTypes.string)])), + params: [ + BridgeParameter('url', + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string)), false), + ])), 'getFilterList': BridgeMethodDef(BridgeFunctionDef( returns: BridgeTypeAnnotation(BridgeTypeRef( CoreTypes.list, [BridgeTypeRef(CoreTypes.dynamic)])), @@ -1147,6 +1154,10 @@ class $MProvider extends MProvider with $Bridge { return list.map((e) => (e is $Value ? e.$reified : e) as Video).toList(); } + @override + Future getHtmlContent(String url) async => + await $_invoke('getHtmlContent', [$String(url)]); + @override Map get headers { try { diff --git a/lib/eval/dart/model/m_provider.dart b/lib/eval/dart/model/m_provider.dart index 24d216c..4c3e573 100644 --- a/lib/eval/dart/model/m_provider.dart +++ b/lib/eval/dart/model/m_provider.dart @@ -24,6 +24,8 @@ abstract class MProvider { Future> getVideoList(String url); + Future getHtmlContent(String url); + List getFilterList(); List getSourcePreferences(); diff --git a/lib/eval/dart/service.dart b/lib/eval/dart/service.dart index 86c2c75..31b35f2 100644 --- a/lib/eval/dart/service.dart +++ b/lib/eval/dart/service.dart @@ -102,6 +102,10 @@ class DartExtensionService { return await _executeLib().getVideoList(url); } + Future getHtmlContent(String url) async { + return await _executeLib().getHtmlContent(url); + } + List getFilterList() { return _executeLib() .getFilterList() diff --git a/lib/eval/javascript/service.dart b/lib/eval/javascript/service.dart index 93b635b..aa97d3a 100644 --- a/lib/eval/javascript/service.dart +++ b/lib/eval/javascript/service.dart @@ -143,6 +143,14 @@ var extention = new DefaultExtension(); .toList(); } + Future getHtmlContent(String url) async { + _init(); + final res = (await runtime.handlePromise(await runtime.evaluateAsync( + 'jsonStringify(() => extention.getHtmlContent(`$url`))'))) + .stringResult; + return res; + } + dynamic getFilterList() { _init(); try { diff --git a/lib/modules/browse/extension/edit_code.dart b/lib/modules/browse/extension/edit_code.dart index 7abc696..1455a35 100644 --- a/lib/modules/browse/extension/edit_code.dart +++ b/lib/modules/browse/extension/edit_code.dart @@ -46,7 +46,8 @@ class _CodeEditorState extends ConsumerState { ("search", 2), ("getDetail", 3), ("getPageList", 4), - ("getVideoList", 5) + ("getVideoList", 5), + ("getHtmlContent", 6) ]; int _serviceIndex = 0; @@ -204,7 +205,8 @@ class _CodeEditorState extends ConsumerState { }), if (_serviceIndex == 3 || _serviceIndex == 4 || - _serviceIndex == 5) + _serviceIndex == 5 || + _serviceIndex == 6) _textEditing("Url", context, "ex: url of the entry", (v) { _url = v; @@ -278,7 +280,7 @@ class _CodeEditorState extends ConsumerState { .toList(); } result = {"pages": result}; - } else { + } else if (_serviceIndex == 5) { if (source!.sourceCodeLanguage == SourceCodeLanguage.dart) { result = @@ -294,6 +296,18 @@ class _CodeEditorState extends ConsumerState { .map((e) => e.toJson()) .toList(); } + } else { + if (source!.sourceCodeLanguage == + SourceCodeLanguage.dart) { + result = + (await DartExtensionService( + source) + .getHtmlContent(_url)); + } else { + result = (await JsExtensionService( + source) + .getHtmlContent(_url)); + } } if (mounted) { setState(() { diff --git a/lib/modules/browse/extension/widgets/create_extension.dart b/lib/modules/browse/extension/widgets/create_extension.dart index 316f161..e83fab4 100644 --- a/lib/modules/browse/extension/widgets/create_extension.dart +++ b/lib/modules/browse/extension/widgets/create_extension.dart @@ -277,6 +277,12 @@ class TestSource extends MProvider { // TODO: implement } + // For novel html content + @override + Future getHtmlContent(String url) async { + // TODO: implement + } + // For anime episode video list @override Future> getVideoList(String url) async { @@ -335,6 +341,10 @@ class DefaultExtension extends MProvider { async getDetail(url) { throw new Error("getDetail not implemented"); } + // For novel html content + async getHtmlContent(url) { + throw new Error("getHtmlContent not implemented"); + } // For anime episode video list async getVideoList(url) { throw new Error("getVideoList not implemented"); diff --git a/lib/modules/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart index a0cae39..353efdb 100644 --- a/lib/modules/novel/novel_reader_view.dart +++ b/lib/modules/novel/novel_reader_view.dart @@ -11,7 +11,9 @@ import 'package:mangayomi/models/page.dart'; import 'package:mangayomi/modules/anime/widgets/desktop.dart'; import 'package:mangayomi/modules/manga/reader/widgets/btn_chapter_list_dialog.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; +import 'package:mangayomi/modules/novel/novel_reader_controller_provider.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; +import 'package:mangayomi/services/get_html_content.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'; @@ -33,11 +35,14 @@ class NovelReaderView extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - ref.watch(getChapterPagesProvider( - chapter: chapter, - )); // TODO fetch html body content + chapter.manga.loadSync(); + final source = getSource(chapter.manga.value!.lang!, chapter.manga.value!.source!); + final htmlContent = ref.watch(getHtmlContentProvider( + source: source!, + url: chapter.url! + )); - return NovelWebView(chapter: chapter); + return NovelWebView(chapter: chapter, htmlContent: htmlContent,); } } @@ -45,9 +50,11 @@ class NovelWebView extends ConsumerStatefulWidget { const NovelWebView({ super.key, required this.chapter, + required this.htmlContent, }); final Chapter chapter; + final AsyncValue htmlContent; @override ConsumerState createState() { @@ -57,8 +64,8 @@ class NovelWebView extends ConsumerStatefulWidget { class _NovelWebViewState extends ConsumerState with TickerProviderStateMixin { - late final ReaderController _readerController = - ref.read(readerControllerProvider(chapter: chapter).notifier); + late final NovelReaderController _readerController = + ref.read(novelReaderControllerProvider(chapter: chapter).notifier); bool isDesktop = Platform.isMacOS || Platform.isLinux || Platform.isWindows; @override @@ -66,7 +73,6 @@ class _NovelWebViewState extends ConsumerState _readerController.setMangaHistoryUpdate(); _readerController.checkAndSyncProgress(); _rebuildDetail.close(); - _autoScroll.value = false; clearGestureDetailsCache(); if (isDesktop) { setFullScreen(value: false); @@ -77,13 +83,8 @@ class _NovelWebViewState extends ConsumerState super.dispose(); } - late final _autoScroll = - ValueNotifier(_readerController.autoScrollValues().$1); - late Chapter chapter = widget.chapter; - final _failedToLoadImage = ValueNotifier(false); - final StreamController _rebuildDetail = StreamController.broadcast(); @override @@ -91,7 +92,6 @@ class _NovelWebViewState extends ConsumerState super.initState(); } - late int pagePreloadAmount = ref.watch(pagePreloadAmountStateProvider); late bool _isBookmarked = _readerController.getChapterBookmarked(); bool _isView = false; @@ -182,9 +182,11 @@ class _NovelWebViewState extends ConsumerState child: Column( children: [ Expanded( - child: SingleChildScrollView( + child: widget.htmlContent.when( + data: (htmlContent) => SingleChildScrollView( + physics: const BouncingScrollPhysics(), child: Html( - data: """""", + data: htmlContent, style: { "*": Style( backgroundColor: Colors.white, @@ -192,7 +194,9 @@ class _NovelWebViewState extends ConsumerState }, shrinkWrap: true, ), - ), + ), + loading: () => const Center(child: CircularProgressIndicator(),), + error: (err, stack) => Center(child: Text(err.toString()),)), ), _appBar(), ], diff --git a/lib/services/get_html_content.dart b/lib/services/get_html_content.dart new file mode 100644 index 0000000..7c2d8a9 --- /dev/null +++ b/lib/services/get_html_content.dart @@ -0,0 +1,21 @@ +import 'package:mangayomi/eval/dart/service.dart'; +import 'package:mangayomi/eval/javascript/service.dart'; +import 'package:mangayomi/models/source.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +part 'get_html_content.g.dart'; + +@riverpod +Future getHtmlContent( + Ref ref, { + required String url, + required Source source, +}) async { + String? html; + if (source.sourceCodeLanguage == SourceCodeLanguage.dart) { + html = await DartExtensionService(source).getHtmlContent(url); + } else { + html = await JsExtensionService(source).getHtmlContent(url); + } + return html; +} diff --git a/lib/services/get_html_content.g.dart b/lib/services/get_html_content.g.dart new file mode 100644 index 0000000..fbd4207 --- /dev/null +++ b/lib/services/get_html_content.g.dart @@ -0,0 +1,177 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'get_html_content.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$getHtmlContentHash() => r'1d7f76fb0f3b3cc9a5012746ec478269c0f0d5e0'; + +/// Copied from Dart SDK +class _SystemHash { + _SystemHash._(); + + static int combine(int hash, int value) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + value); + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x0007ffff & hash) << 10)); + return hash ^ (hash >> 6); + } + + static int finish(int hash) { + // ignore: parameter_assignments + hash = 0x1fffffff & (hash + ((0x03ffffff & hash) << 3)); + // ignore: parameter_assignments + hash = hash ^ (hash >> 11); + return 0x1fffffff & (hash + ((0x00003fff & hash) << 15)); + } +} + +/// See also [getHtmlContent]. +@ProviderFor(getHtmlContent) +const getHtmlContentProvider = GetHtmlContentFamily(); + +/// See also [getHtmlContent]. +class GetHtmlContentFamily extends Family> { + /// See also [getHtmlContent]. + const GetHtmlContentFamily(); + + /// See also [getHtmlContent]. + GetHtmlContentProvider call({ + required String url, + required Source source, + }) { + return GetHtmlContentProvider( + url: url, + source: source, + ); + } + + @override + GetHtmlContentProvider getProviderOverride( + covariant GetHtmlContentProvider provider, + ) { + return call( + url: provider.url, + source: provider.source, + ); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'getHtmlContentProvider'; +} + +/// See also [getHtmlContent]. +class GetHtmlContentProvider extends AutoDisposeFutureProvider { + /// See also [getHtmlContent]. + GetHtmlContentProvider({ + required String url, + required Source source, + }) : this._internal( + (ref) => getHtmlContent( + ref as GetHtmlContentRef, + url: url, + source: source, + ), + from: getHtmlContentProvider, + name: r'getHtmlContentProvider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$getHtmlContentHash, + dependencies: GetHtmlContentFamily._dependencies, + allTransitiveDependencies: + GetHtmlContentFamily._allTransitiveDependencies, + url: url, + source: source, + ); + + GetHtmlContentProvider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.url, + required this.source, + }) : super.internal(); + + final String url; + final Source source; + + @override + Override overrideWith( + FutureOr Function(GetHtmlContentRef provider) create, + ) { + return ProviderOverride( + origin: this, + override: GetHtmlContentProvider._internal( + (ref) => create(ref as GetHtmlContentRef), + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + url: url, + source: source, + ), + ); + } + + @override + AutoDisposeFutureProviderElement createElement() { + return _GetHtmlContentProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is GetHtmlContentProvider && + other.url == url && + other.source == source; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, url.hashCode); + hash = _SystemHash.combine(hash, source.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin GetHtmlContentRef on AutoDisposeFutureProviderRef { + /// The parameter `url` of this provider. + String get url; + + /// The parameter `source` of this provider. + Source get source; +} + +class _GetHtmlContentProviderElement + extends AutoDisposeFutureProviderElement with GetHtmlContentRef { + _GetHtmlContentProviderElement(super.provider); + + @override + String get url => (origin as GetHtmlContentProvider).url; + @override + Source get source => (origin as GetHtmlContentProvider).source; +} +// ignore_for_file: type=lint +// ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/pubspec.lock b/pubspec.lock index 6a73d01..16b6bc2 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -5,23 +5,23 @@ packages: dependency: transitive description: name: _fe_analyzer_shared - sha256: f256b0c0ba6c7577c15e2e4e114755640a875e885099367bf6e012b19314c834 + sha256: "16e298750b6d0af7ce8a3ba7c18c69c3785d11b15ec83f6dcd0ad2a0009b3cab" url: "https://pub.dev" source: hosted - version: "72.0.0" + version: "76.0.0" _macros: dependency: transitive description: dart source: sdk - version: "0.3.2" + version: "0.3.3" analyzer: dependency: "direct overridden" description: name: analyzer - sha256: b652861553cd3990d8ed361f7979dc6d7053a9ac8843fa73820ab68ce5410139 + sha256: "1f14db053a8c23e260789e9b0980fa27f2680dd640932cae5e1137cce0e46e1e" url: "https://pub.dev" source: hosted - version: "6.7.0" + version: "6.11.0" analyzer_plugin: dependency: transitive description: @@ -98,10 +98,10 @@ packages: dependency: transitive description: name: build - sha256: "80184af8b6cb3e5c1c4ec6d8544d27711700bc3e6d2efad04238c7b5290889f0" + sha256: cef23f1eda9b57566c81e2133d196f8e3df48f244b317368d65c5943d91148f0 url: "https://pub.dev" source: hosted - version: "2.4.1" + version: "2.4.2" build_cli_annotations: dependency: transitive description: @@ -114,42 +114,42 @@ packages: dependency: transitive description: name: build_config - sha256: bf80fcfb46a29945b423bd9aad884590fb1dc69b330a4d4700cac476af1708d1 + sha256: "4ae2de3e1e67ea270081eaee972e1bd8f027d459f249e0f1186730784c2e7e33" url: "https://pub.dev" source: hosted - version: "1.1.1" + version: "1.1.2" build_daemon: dependency: transitive description: name: build_daemon - sha256: "79b2aef6ac2ed00046867ed354c88778c9c0f029df8a20fe10b5436826721ef9" + sha256: "294a2edaf4814a378725bfe6358210196f5ea37af89ecd81bfa32960113d4948" url: "https://pub.dev" source: hosted - version: "4.0.2" + version: "4.0.3" build_resolvers: dependency: transitive description: name: build_resolvers - sha256: "339086358431fa15d7eca8b6a36e5d783728cf025e559b834f4609a1fcfb7b0a" + sha256: "99d3980049739a985cf9b21f30881f46db3ebc62c5b8d5e60e27440876b1ba1e" url: "https://pub.dev" source: hosted - version: "2.4.2" + version: "2.4.3" build_runner: dependency: "direct dev" description: name: build_runner - sha256: "028819cfb90051c6b5440c7e574d1896f8037e3c96cf17aaeb054c9311cfbf4d" + sha256: "74691599a5bc750dc96a6b4bfd48f7d9d66453eab04c7f4063134800d6a5c573" url: "https://pub.dev" source: hosted - version: "2.4.13" + version: "2.4.14" build_runner_core: dependency: transitive description: name: build_runner_core - sha256: f8126682b87a7282a339b871298cc12009cb67109cfa1614d6436fb0289193e0 + sha256: "22e3aa1c80e0ada3722fe5b63fd43d9c8990759d0a2cf489c8c5d7b2bdebc021" url: "https://pub.dev" source: hosted - version: "7.3.2" + version: "8.0.0" built_collection: dependency: transitive description: @@ -162,10 +162,10 @@ packages: dependency: transitive description: name: built_value - sha256: c7913a9737ee4007efedaffc968c049fd0f3d0e49109e778edc10de9426005cb + sha256: "28a712df2576b63c6c005c465989a348604960c0958d28be5303ba9baa841ac2" url: "https://pub.dev" source: hosted - version: "8.9.2" + version: "8.9.3" change_case: dependency: transitive description: @@ -282,10 +282,10 @@ packages: dependency: transitive description: name: custom_lint_visitor - sha256: "8aeb3b6ae2bb765e7716b93d1d10e8356d04e0ff6d7592de6ee04e0dd7d6587d" + sha256: bfe9b7a09c4775a587b58d10ebb871d4fe618237639b1e84d5ec62d7dfef25f9 url: "https://pub.dev" source: hosted - version: "1.0.0+6.7.0" + version: "1.0.0+6.11.0" dart_eval: dependency: "direct main" description: @@ -355,10 +355,10 @@ packages: dependency: transitive description: name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 + sha256: "567c64b3cb4cf82397aac55f4f0cbd3ca20d77c6c03bedbc4ceaddc08904aef7" url: "https://pub.dev" source: hosted - version: "2.0.5" + version: "2.0.7" exception_templates: dependency: transitive description: @@ -435,10 +435,10 @@ packages: dependency: "direct main" description: name: file_picker - sha256: "16dc141db5a2ccc6520ebb6a2eb5945b1b09e95085c021d9f914f8ded7f1465c" + sha256: c2376a6aae82358a9f9ccdd7d1f4006d08faa39a2767cce01031d9f593a8bd3b url: "https://pub.dev" source: hosted - version: "8.1.4" + version: "8.1.6" fixnum: dependency: transitive description: @@ -581,10 +581,10 @@ packages: dependency: transitive description: name: flutter_plugin_android_lifecycle - sha256: "9b78450b89f059e96c9ebb355fa6b3df1d6b330436e0b885fb49594c41721398" + sha256: "615a505aef59b151b46bbeef55b36ce2b6ed299d160c51d84281946f0aa0ce0e" url: "https://pub.dev" source: hosted - version: "2.0.23" + version: "2.0.24" flutter_qjs: dependency: "direct main" description: @@ -680,10 +680,10 @@ packages: dependency: "direct main" description: name: go_router - sha256: "8ae664a70174163b9f65ea68dd8673e29db8f9095de7b5cd00e167c621f4fef5" + sha256: "2fd11229f59e23e967b0775df8d5948a519cd7e1e8b6e849729e010587b46539" url: "https://pub.dev" source: hosted - version: "14.6.0" + version: "14.6.2" google_fonts: dependency: "direct main" description: @@ -760,10 +760,10 @@ packages: dependency: transitive description: name: http_multi_server - sha256: "97486f20f9c2f7be8f514851703d0119c3596d14ea63227af6f7a481ef2b2f8b" + sha256: aa6199f908078bb1c5efb8d8638d4ae191aac11b311132c3ef48ce352fb52ef8 url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" http_parser: dependency: transitive description: @@ -800,10 +800,10 @@ packages: dependency: transitive description: name: io - sha256: "2ec25704aba361659e10e3e5f5d672068d332fc8ac516421d483a11e5cbd061e" + sha256: dfd5a80599cf0165756e3181807ed3e77daf6dd4137caaad72d0b7931597650b url: "https://pub.dev" source: hosted - version: "1.0.4" + version: "1.0.5" iregexp: dependency: transitive description: @@ -888,18 +888,18 @@ packages: dependency: transitive description: name: leak_tracker - sha256: "3f87a60e8c63aecc975dda1ceedbc8f24de75f09e4856ea27daf8958f2f0ce05" + sha256: "7bb2830ebd849694d1ec25bf1f44582d6ac531a57a365a803a6034ff751d2d06" url: "https://pub.dev" source: hosted - version: "10.0.5" + version: "10.0.7" leak_tracker_flutter_testing: dependency: transitive description: name: leak_tracker_flutter_testing - sha256: "932549fb305594d82d7183ecd9fa93463e9914e1b67cacc34bc40906594a1806" + sha256: "9491a714cca3667b60b5c420da8217e6de0d1ba7a5ec322fab01758f6998f379" url: "https://pub.dev" source: hosted - version: "3.0.5" + version: "3.0.8" leak_tracker_testing: dependency: transitive description: @@ -944,10 +944,10 @@ packages: dependency: transitive description: name: macros - sha256: "0acaed5d6b7eab89f63350bccd82119e6c602df0f391260d0e32b5e23db79536" + sha256: "1d9e801cd66f7ea3663c45fc708450db1fa57f988142c64289142c9b7ee80656" url: "https://pub.dev" source: hosted - version: "0.1.2-main.4" + version: "0.1.3-main.0" matcher: dependency: transitive description: @@ -1083,26 +1083,26 @@ packages: dependency: transitive description: name: package_config - sha256: "1c5b77ccc91e4823a5af61ee74e6b972db1ef98c2ff5a18d3161c982a55448bd" + sha256: "92d4488434b520a62570293fbd33bb556c7d49230791c1b4bbd973baf6d2dc67" url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" package_info_plus: dependency: "direct main" description: name: package_info_plus - sha256: da8d9ac8c4b1df253d1a328b7bf01ae77ef132833479ab40763334db13b91cce + sha256: "70c421fe9d9cc1a9a7f3b05ae56befd469fe4f8daa3b484823141a55442d858d" url: "https://pub.dev" source: hosted - version: "8.1.1" + version: "8.1.2" package_info_plus_platform_interface: dependency: transitive description: name: package_info_plus_platform_interface - sha256: ac1f4a4847f1ade8e6a87d1f39f5d7c67490738642e2542f559ec38c37489a66 + sha256: a5ef9986efc7bf772f2696183a3992615baa76c1ffb1189318dd8803778fb05b url: "https://pub.dev" source: hosted - version: "3.0.1" + version: "3.0.2" path: dependency: "direct main" description: @@ -1123,18 +1123,18 @@ packages: dependency: transitive description: name: path_provider_android - sha256: c464428172cb986b758c6d1724c603097febb8fb855aa265aeecc9280c294d4a + sha256: "4adf4fd5423ec60a29506c76581bc05854c55e3a0b72d35bb28d661c9686edf2" url: "https://pub.dev" source: hosted - version: "2.2.12" + version: "2.2.15" path_provider_foundation: dependency: transitive description: name: path_provider_foundation - sha256: f234384a3fdd67f989b4d54a5d73ca2a6c422fa55ae694381ae0f4375cd1ea16 + sha256: "4843174df4d288f5e29185bd6e72a6fbdf5a4a4602717eed565497429f179942" url: "https://pub.dev" source: hosted - version: "2.4.0" + version: "2.4.1" path_provider_linux: dependency: transitive description: @@ -1267,10 +1267,10 @@ packages: dependency: transitive description: name: pub_semver - sha256: "40d3ab1bbd474c4c2328c91e3a7df8c6dd629b79ece4c4bd04bee496a224fb0c" + sha256: "7b3cfbf654f3edd0c6298ecd5be782ce997ddf0e00531b9464b55245185bbbbd" url: "https://pub.dev" source: hosted - version: "2.1.4" + version: "2.1.5" pubspec_parse: dependency: transitive description: @@ -1426,18 +1426,18 @@ packages: dependency: "direct main" description: name: share_plus - sha256: "9c9bafd4060728d7cdb2464c341743adbd79d327cb067ec7afb64583540b47c8" + sha256: "6327c3f233729374d0abaafd61f6846115b2a481b4feddd8534211dc10659400" url: "https://pub.dev" source: hosted - version: "10.1.2" + version: "10.1.3" share_plus_platform_interface: dependency: transitive description: name: share_plus_platform_interface - sha256: c57c0bbfec7142e3a0f55633be504b796af72e60e3c791b44d5a017b985f7a48 + sha256: cc012a23fc2d479854e6c80150696c4a5f5bb62cb89af4de1c505cf78d0a5d0b url: "https://pub.dev" source: hosted - version: "5.0.1" + version: "5.0.2" shelf: dependency: transitive description: @@ -1450,15 +1450,15 @@ packages: dependency: transitive description: name: shelf_web_socket - sha256: "073c147238594ecd0d193f3456a5fe91c4b0abbcc68bf5cd95b36c4e194ac611" + sha256: cc36c297b52866d203dbf9332263c94becc2fe0ceaa9681d07b6ef9807023b67 url: "https://pub.dev" source: hosted - version: "2.0.0" + version: "2.0.1" sky_engine: dependency: transitive description: flutter source: sdk - version: "0.0.99" + version: "0.0.0" source_gen: dependency: transitive description: @@ -1487,10 +1487,10 @@ packages: dependency: transitive description: name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" + sha256: "9f47fd3630d76be3ab26f0ee06d213679aa425996925ff3feffdec504931c377" url: "https://pub.dev" source: hosted - version: "1.11.1" + version: "1.12.0" state_notifier: dependency: transitive description: @@ -1511,18 +1511,18 @@ packages: dependency: transitive description: name: stream_transform - sha256: "14a00e794c7c11aa145a170587321aedce29769c08d7f58b1d141da75e3b1c6f" + sha256: ad47125e588cfd37a9a7f86c7d6356dde8dfe89d071d293f80ca9e9273a33871 url: "https://pub.dev" source: hosted - version: "2.1.0" + version: "2.1.1" string_scanner: dependency: transitive description: name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" + sha256: "688af5ed3402a4bde5b3a6c15fd768dbf2621a614950b17f04626c431ab3c4c3" url: "https://pub.dev" source: hosted - version: "1.2.0" + version: "1.3.0" super_sliver_list: dependency: "direct main" description: @@ -1551,10 +1551,10 @@ packages: dependency: transitive description: name: test_api - sha256: "5b8a98dafc4d5c4c9c72d8b31ab2b23fc13422348d2997120294d3bac86b4ddb" + sha256: "664d3a9a64782fcdeb83ce9c6b39e78fd2971d4e37827b9b06c3aa1edc5e760c" url: "https://pub.dev" source: hosted - version: "0.7.2" + version: "0.7.3" time: dependency: transitive description: @@ -1567,10 +1567,10 @@ packages: dependency: transitive description: name: timing - sha256: "70a3b636575d4163c477e6de42f247a23b315ae20e86442bebe32d3cabf61c32" + sha256: "62ee18aca144e4a9f29d212f5a4c6a053be252b895ab14b5821996cff4ed90fe" url: "https://pub.dev" source: hosted - version: "1.0.1" + version: "1.0.2" tuple: dependency: transitive description: @@ -1623,10 +1623,10 @@ packages: dependency: transitive description: name: url_launcher_ios - sha256: e43b677296fadce447e987a2f519dcf5f6d1e527dc35d01ffab4fff5b8a7063e + sha256: "16a513b6c12bb419304e72ea0ae2ab4fed569920d1c7cb850263fe3acc824626" url: "https://pub.dev" source: hosted - version: "6.3.1" + version: "6.3.2" url_launcher_linux: dependency: transitive description: @@ -1639,10 +1639,10 @@ packages: dependency: transitive description: name: url_launcher_macos - sha256: "769549c999acdb42b8bcfa7c43d72bf79a382ca7441ab18a808e101149daf672" + sha256: "17ba2000b847f334f16626a574c702b196723af2a289e7a93ffcb79acff855c2" url: "https://pub.dev" source: hosted - version: "3.2.1" + version: "3.2.2" url_launcher_platform_interface: dependency: transitive description: @@ -1687,10 +1687,10 @@ packages: dependency: transitive description: name: vm_service - sha256: "5c5f338a667b4c644744b661f309fb8080bb94b18a7e91ef1dbd343bed00ed6d" + sha256: f6be3ed8bd01289b34d679c2b62226f63c0e69f9fd2e50a6b3c1c729a961041b url: "https://pub.dev" source: hosted - version: "14.2.5" + version: "14.3.0" volume_controller: dependency: transitive description: @@ -1719,10 +1719,10 @@ packages: dependency: transitive description: name: watcher - sha256: "3d2ad6751b3c16cf07c7fca317a1413b3f26530319181b37e3b9039b84fc01d8" + sha256: "69da27e49efa56a15f8afe8f4438c4ec02eff0a117df1b22ea4aad194fe1c104" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.1.1" web: dependency: transitive description: @@ -1751,10 +1751,10 @@ packages: dependency: transitive description: name: win32 - sha256: "84ba388638ed7a8cb3445a320c8273136ab2631cd5f2c57888335504ddab1bc2" + sha256: "8b338d4486ab3fbc0ba0db9f9b4f5239b6697fcee427939a40e720cbb9ee0a69" url: "https://pub.dev" source: hosted - version: "5.8.0" + version: "5.9.0" window_manager: dependency: "direct main" description: @@ -1807,10 +1807,10 @@ packages: dependency: transitive description: name: xxh3 - sha256: cbeb0e1d10f4c6bf67b650f395eac0cc689425b5efc2ba0cc3d3e069a0beaeec + sha256: "399a0438f5d426785723c99da6b16e136f4953fb1e9db0bf270bd41dd4619916" url: "https://pub.dev" source: hosted - version: "1.1.0" + version: "1.2.0" yaml: dependency: transitive description: @@ -1828,5 +1828,5 @@ packages: source: hosted version: "2.2.1" sdks: - dart: ">=3.5.4 <4.0.0" + dart: ">=3.6.0 <4.0.0" flutter: ">=3.24.0" From a531e87bdafe57a42fb29abbd8637e791cf62aee Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Fri, 20 Dec 2024 00:31:21 +0100 Subject: [PATCH 11/18] formatted --- lib/modules/novel/novel_reader_view.dart | 52 +++++++++++++----------- 1 file changed, 29 insertions(+), 23 deletions(-) diff --git a/lib/modules/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart index 353efdb..89159c2 100644 --- a/lib/modules/novel/novel_reader_view.dart +++ b/lib/modules/novel/novel_reader_view.dart @@ -36,13 +36,15 @@ class NovelReaderView extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { chapter.manga.loadSync(); - final source = getSource(chapter.manga.value!.lang!, chapter.manga.value!.source!); - final htmlContent = ref.watch(getHtmlContentProvider( - source: source!, - url: chapter.url! - )); + final source = + getSource(chapter.manga.value!.lang!, chapter.manga.value!.source!); + final htmlContent = + ref.watch(getHtmlContentProvider(source: source!, url: chapter.url!)); - return NovelWebView(chapter: chapter, htmlContent: htmlContent,); + return NovelWebView( + chapter: chapter, + htmlContent: htmlContent, + ); } } @@ -181,23 +183,27 @@ class _NovelWebViewState extends ConsumerState bottom: false, child: Column( children: [ - Expanded( - child: widget.htmlContent.when( - data: (htmlContent) => SingleChildScrollView( - physics: const BouncingScrollPhysics(), - child: Html( - data: htmlContent, - style: { - "*": Style( - backgroundColor: Colors.white, - margin: Margins.all(5)) - }, - shrinkWrap: true, - ), - ), - loading: () => const Center(child: CircularProgressIndicator(),), - error: (err, stack) => Center(child: Text(err.toString()),)), - ), + widget.htmlContent.when( + data: (htmlContent) => Expanded( + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: Html( + data: htmlContent, + style: { + "*": Style( + backgroundColor: Colors.white, + margin: Margins.all(5)) + }, + shrinkWrap: true, + ), + ), + ), + loading: () => const Center( + child: CircularProgressIndicator(), + ), + error: (err, stack) => Center( + child: Text(err.toString()), + )), _appBar(), ], ), From a813758510e7484aee4f45a6dcd46990e5326b97 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Fri, 20 Dec 2024 00:45:13 +0100 Subject: [PATCH 12/18] fixed build loop --- lib/modules/novel/novel_reader_view.dart | 6 +-- lib/services/get_html_content.dart | 19 ++++++---- lib/services/get_html_content.g.dart | 47 ++++++++---------------- 3 files changed, 27 insertions(+), 45 deletions(-) diff --git a/lib/modules/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart index 89159c2..f5241ad 100644 --- a/lib/modules/novel/novel_reader_view.dart +++ b/lib/modules/novel/novel_reader_view.dart @@ -35,11 +35,7 @@ class NovelReaderView extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - chapter.manga.loadSync(); - final source = - getSource(chapter.manga.value!.lang!, chapter.manga.value!.source!); - final htmlContent = - ref.watch(getHtmlContentProvider(source: source!, url: chapter.url!)); + final htmlContent = ref.watch(getHtmlContentProvider(chapter: chapter)); return NovelWebView( chapter: chapter, diff --git a/lib/services/get_html_content.dart b/lib/services/get_html_content.dart index 7c2d8a9..fdf9e3e 100644 --- a/lib/services/get_html_content.dart +++ b/lib/services/get_html_content.dart @@ -1,21 +1,24 @@ import 'package:mangayomi/eval/dart/service.dart'; import 'package:mangayomi/eval/javascript/service.dart'; +import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/source.dart'; +import 'package:mangayomi/utils/utils.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'get_html_content.g.dart'; @riverpod -Future getHtmlContent( - Ref ref, { - required String url, - required Source source, -}) async { +Future getHtmlContent(Ref ref, {required Chapter chapter}) async { + if (!chapter.manga.isLoaded) { + chapter.manga.loadSync(); + } + final source = + getSource(chapter.manga.value!.lang!, chapter.manga.value!.source!); String? html; - if (source.sourceCodeLanguage == SourceCodeLanguage.dart) { - html = await DartExtensionService(source).getHtmlContent(url); + if (source!.sourceCodeLanguage == SourceCodeLanguage.dart) { + html = await DartExtensionService(source).getHtmlContent(chapter.url!); } else { - html = await JsExtensionService(source).getHtmlContent(url); + html = await JsExtensionService(source).getHtmlContent(chapter.url!); } return html; } diff --git a/lib/services/get_html_content.g.dart b/lib/services/get_html_content.g.dart index fbd4207..6737048 100644 --- a/lib/services/get_html_content.g.dart +++ b/lib/services/get_html_content.g.dart @@ -6,7 +6,7 @@ part of 'get_html_content.dart'; // RiverpodGenerator // ************************************************************************** -String _$getHtmlContentHash() => r'1d7f76fb0f3b3cc9a5012746ec478269c0f0d5e0'; +String _$getHtmlContentHash() => r'709b68d8d590290081b409c22e402b7d1a7eec76'; /// Copied from Dart SDK class _SystemHash { @@ -40,12 +40,10 @@ class GetHtmlContentFamily extends Family> { /// See also [getHtmlContent]. GetHtmlContentProvider call({ - required String url, - required Source source, + required Chapter chapter, }) { return GetHtmlContentProvider( - url: url, - source: source, + chapter: chapter, ); } @@ -54,8 +52,7 @@ class GetHtmlContentFamily extends Family> { covariant GetHtmlContentProvider provider, ) { return call( - url: provider.url, - source: provider.source, + chapter: provider.chapter, ); } @@ -78,13 +75,11 @@ class GetHtmlContentFamily extends Family> { class GetHtmlContentProvider extends AutoDisposeFutureProvider { /// See also [getHtmlContent]. GetHtmlContentProvider({ - required String url, - required Source source, + required Chapter chapter, }) : this._internal( (ref) => getHtmlContent( ref as GetHtmlContentRef, - url: url, - source: source, + chapter: chapter, ), from: getHtmlContentProvider, name: r'getHtmlContentProvider', @@ -95,8 +90,7 @@ class GetHtmlContentProvider extends AutoDisposeFutureProvider { dependencies: GetHtmlContentFamily._dependencies, allTransitiveDependencies: GetHtmlContentFamily._allTransitiveDependencies, - url: url, - source: source, + chapter: chapter, ); GetHtmlContentProvider._internal( @@ -106,12 +100,10 @@ class GetHtmlContentProvider extends AutoDisposeFutureProvider { required super.allTransitiveDependencies, required super.debugGetCreateSourceHash, required super.from, - required this.url, - required this.source, + required this.chapter, }) : super.internal(); - final String url; - final Source source; + final Chapter chapter; @override Override overrideWith( @@ -126,8 +118,7 @@ class GetHtmlContentProvider extends AutoDisposeFutureProvider { dependencies: null, allTransitiveDependencies: null, debugGetCreateSourceHash: null, - url: url, - source: source, + chapter: chapter, ), ); } @@ -139,16 +130,13 @@ class GetHtmlContentProvider extends AutoDisposeFutureProvider { @override bool operator ==(Object other) { - return other is GetHtmlContentProvider && - other.url == url && - other.source == source; + return other is GetHtmlContentProvider && other.chapter == chapter; } @override int get hashCode { var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, url.hashCode); - hash = _SystemHash.combine(hash, source.hashCode); + hash = _SystemHash.combine(hash, chapter.hashCode); return _SystemHash.finish(hash); } @@ -157,11 +145,8 @@ class GetHtmlContentProvider extends AutoDisposeFutureProvider { @Deprecated('Will be removed in 3.0. Use Ref instead') // ignore: unused_element mixin GetHtmlContentRef on AutoDisposeFutureProviderRef { - /// The parameter `url` of this provider. - String get url; - - /// The parameter `source` of this provider. - Source get source; + /// The parameter `chapter` of this provider. + Chapter get chapter; } class _GetHtmlContentProviderElement @@ -169,9 +154,7 @@ class _GetHtmlContentProviderElement _GetHtmlContentProviderElement(super.provider); @override - String get url => (origin as GetHtmlContentProvider).url; - @override - Source get source => (origin as GetHtmlContentProvider).source; + Chapter get chapter => (origin as GetHtmlContentProvider).chapter; } // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package From c01aa6d0234eeda0cc3b50219d4f2e4c7d0369a2 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sat, 21 Dec 2024 00:21:03 +0100 Subject: [PATCH 13/18] changed to a different html widget --- devtools_options.yaml | 3 + lib/modules/novel/novel_reader_view.dart | 151 ++++++-- lib/services/aniskip.g.dart | 2 +- lib/services/get_html_content.dart | 5 +- lib/services/get_html_content.g.dart | 2 +- lib/services/trackers/anilist.g.dart | 2 +- macos/Flutter/GeneratedPluginRegistrant.swift | 10 + pubspec.lock | 328 +++++++++++++++++- pubspec.yaml | 2 +- 9 files changed, 461 insertions(+), 44 deletions(-) create mode 100644 devtools_options.yaml diff --git a/devtools_options.yaml b/devtools_options.yaml new file mode 100644 index 0000000..fa0b357 --- /dev/null +++ b/devtools_options.yaml @@ -0,0 +1,3 @@ +description: This file stores settings for Dart & Flutter DevTools. +documentation: https://docs.flutter.dev/tools/devtools/extensions#configure-extension-enablement-states +extensions: diff --git a/lib/modules/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart index b4530fd..f10febe 100644 --- a/lib/modules/novel/novel_reader_view.dart +++ b/lib/modules/novel/novel_reader_view.dart @@ -8,6 +8,7 @@ import 'package:flutter/material.dart'; import 'package:go_router/go_router.dart'; import 'package:mangayomi/models/chapter.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/widgets/btn_chapter_list_dialog.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; @@ -19,10 +20,9 @@ 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/global_style.dart'; -import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:window_manager/window_manager.dart'; -import 'package:flutter_html/flutter_html.dart'; +import 'package:flutter_widget_from_html/flutter_widget_from_html.dart'; typedef DoubleClickAnimationListener = void Function(); @@ -179,27 +179,54 @@ class _NovelWebViewState extends ConsumerState bottom: false, child: Stack( children: [ - widget.htmlContent.when( - data: (htmlContent) => Expanded( - child: SingleChildScrollView( - physics: const BouncingScrollPhysics(), - child: Html( - data: htmlContent, - style: { - "*": Style( - backgroundColor: Colors.white, - margin: Margins.all(5)) - }, - shrinkWrap: true, - ), - ), - ), - loading: () => const Center( - child: CircularProgressIndicator(), - ), - error: (err, stack) => Center( - child: Text(err.toString()), - )), + Row( + children: [ + widget.htmlContent.when( + data: (htmlContent) { + return Expanded( + child: SingleChildScrollView( + physics: const BouncingScrollPhysics(), + child: HtmlWidget( + htmlContent, + customStylesBuilder: (element) { + switch (backgroundColor) { + case BackgroundColor.black: + return { + 'background-color': 'black', + }; + default: + return { + 'background-color': '#F0F0F0', + }; + } + }, + onTapUrl: (url) { + print('tapped $url'); + return true; + }, + renderMode: RenderMode.column, + textStyle: TextStyle( + color: backgroundColor == + BackgroundColor.white + ? Colors.black + : Colors.white, + //fontFamily: "Times New Roman", + //fontFamilyFallback: ["Times", "serif"], + fontSize: 14), + ), + ), + );}, + loading: () => const Expanded( + child: Center( + child: CircularProgressIndicator(), + )), + error: (err, stack) => Center( + child: Text(err.toString()), + )), + ], + ), + _gestureRightLeft(), + _gestureTopBottom(), _appBar(), ], ), @@ -335,6 +362,84 @@ class _NovelWebViewState extends ConsumerState } } } + + Widget _gestureRightLeft() { + return Consumer( + builder: (context, ref, child) { + return Row( + children: [ + /// left region + Expanded( + flex: 2, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + _isViewFunction(); + }, + ), + ), + + /// center region + Expanded( + flex: 2, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + _isViewFunction(); + }, + ), + ), + + /// right region + Expanded( + flex: 2, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + _isViewFunction(); + }, + ), + ), + ], + ); + }, + ); + } + + Widget _gestureTopBottom() { + return Consumer( + builder: (context, ref, child) { + return Column( + children: [ + /// top region + Expanded( + flex: 2, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + _isViewFunction(); + }, + ), + ), + + /// center region + const Expanded(flex: 5, child: SizedBox.shrink()), + + /// bottom region + Expanded( + flex: 2, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + _isViewFunction(); + }, + ), + ), + ], + ); + }, + ); + } } class UChapDataPreload { diff --git a/lib/services/aniskip.g.dart b/lib/services/aniskip.g.dart index b2e1def..c05db92 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'887869b54e2e151633efd46da83bde845e14f421'; +String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c'; /// See also [AniSkip]. @ProviderFor(AniSkip) diff --git a/lib/services/get_html_content.dart b/lib/services/get_html_content.dart index fdf9e3e..f9de323 100644 --- a/lib/services/get_html_content.dart +++ b/lib/services/get_html_content.dart @@ -20,5 +20,8 @@ Future getHtmlContent(Ref ref, {required Chapter chapter}) async { } else { html = await JsExtensionService(source).getHtmlContent(chapter.url!); } - return html; + return '''

${html.substring(1, html.length - 1)}
''' + .replaceAll("\\n", "") + .replaceAll("\\t", "") + .replaceAll("\\", ""); } diff --git a/lib/services/get_html_content.g.dart b/lib/services/get_html_content.g.dart index 6737048..8bf4df3 100644 --- a/lib/services/get_html_content.g.dart +++ b/lib/services/get_html_content.g.dart @@ -6,7 +6,7 @@ part of 'get_html_content.dart'; // RiverpodGenerator // ************************************************************************** -String _$getHtmlContentHash() => r'709b68d8d590290081b409c22e402b7d1a7eec76'; +String _$getHtmlContentHash() => r'5369236d1d8058cd42a832d1d641a37777da653b'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/trackers/anilist.g.dart b/lib/services/trackers/anilist.g.dart index ea4d0e9..dd740dc 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'87784b25bccf5b1c61d6c7494f0569a28494dd8b'; +String _$anilistHash() => r'd3a8852d689b13c3bde46ec05b464e7779149e58'; /// Copied from Dart SDK class _SystemHash { diff --git a/macos/Flutter/GeneratedPluginRegistrant.swift b/macos/Flutter/GeneratedPluginRegistrant.swift index 0ffae2a..3c553d1 100644 --- a/macos/Flutter/GeneratedPluginRegistrant.swift +++ b/macos/Flutter/GeneratedPluginRegistrant.swift @@ -5,10 +5,12 @@ import FlutterMacOS import Foundation +import audio_session import flutter_inappwebview_macos import flutter_qjs import flutter_web_auth_2 import isar_flutter_libs +import just_audio import media_kit_libs_macos_video import media_kit_video import package_info_plus @@ -16,16 +18,21 @@ import path_provider_foundation import screen_brightness_macos import screen_retriever_macos import share_plus +import sqflite_darwin import url_launcher_macos +import video_player_avfoundation import wakelock_plus +import webview_flutter_wkwebview import window_manager import window_to_front func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { + AudioSessionPlugin.register(with: registry.registrar(forPlugin: "AudioSessionPlugin")) InAppWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "InAppWebViewFlutterPlugin")) FlutterQjsPlugin.register(with: registry.registrar(forPlugin: "FlutterQjsPlugin")) FlutterWebAuth2Plugin.register(with: registry.registrar(forPlugin: "FlutterWebAuth2Plugin")) IsarFlutterLibsPlugin.register(with: registry.registrar(forPlugin: "IsarFlutterLibsPlugin")) + JustAudioPlugin.register(with: registry.registrar(forPlugin: "JustAudioPlugin")) MediaKitLibsMacosVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitLibsMacosVideoPlugin")) MediaKitVideoPlugin.register(with: registry.registrar(forPlugin: "MediaKitVideoPlugin")) FPPPackageInfoPlusPlugin.register(with: registry.registrar(forPlugin: "FPPPackageInfoPlusPlugin")) @@ -33,8 +40,11 @@ func RegisterGeneratedPlugins(registry: FlutterPluginRegistry) { ScreenBrightnessMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenBrightnessMacosPlugin")) ScreenRetrieverMacosPlugin.register(with: registry.registrar(forPlugin: "ScreenRetrieverMacosPlugin")) SharePlusMacosPlugin.register(with: registry.registrar(forPlugin: "SharePlusMacosPlugin")) + SqflitePlugin.register(with: registry.registrar(forPlugin: "SqflitePlugin")) UrlLauncherPlugin.register(with: registry.registrar(forPlugin: "UrlLauncherPlugin")) + FVPVideoPlayerPlugin.register(with: registry.registrar(forPlugin: "FVPVideoPlayerPlugin")) WakelockPlusMacosPlugin.register(with: registry.registrar(forPlugin: "WakelockPlusMacosPlugin")) + FLTWebViewFlutterPlugin.register(with: registry.registrar(forPlugin: "FLTWebViewFlutterPlugin")) WindowManagerPlugin.register(with: registry.registrar(forPlugin: "WindowManagerPlugin")) WindowToFrontPlugin.register(with: registry.registrar(forPlugin: "WindowToFrontPlugin")) } diff --git a/pubspec.lock b/pubspec.lock index 168a443..2720009 100644 --- a/pubspec.lock +++ b/pubspec.lock @@ -70,6 +70,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.11.0" + audio_session: + dependency: transitive + description: + name: audio_session + sha256: b2a26ba8b7efa1790d6460e82971fde3e398cfbe2295df9dea22f3499d2c12a7 + url: "https://pub.dev" + source: hosted + version: "0.1.23" autotrie: dependency: transitive description: @@ -166,6 +174,30 @@ packages: url: "https://pub.dev" source: hosted version: "8.9.3" + cached_network_image: + dependency: transitive + description: + name: cached_network_image + sha256: "7c1183e361e5c8b0a0f21a28401eecdbde252441106a9816400dd4c2b2424916" + url: "https://pub.dev" + source: hosted + version: "3.4.1" + cached_network_image_platform_interface: + dependency: transitive + description: + name: cached_network_image_platform_interface + sha256: "35814b016e37fbdc91f7ae18c8caf49ba5c88501813f73ce8a07027a395e2829" + url: "https://pub.dev" + source: hosted + version: "4.1.1" + cached_network_image_web: + dependency: transitive + description: + name: cached_network_image_web + sha256: "980842f4e8e2535b8dbd3d5ca0b1f0ba66bf61d14cc3a17a9b4788a3685ba062" + url: "https://pub.dev" + source: hosted + version: "1.3.1" change_case: dependency: transitive description: @@ -198,6 +230,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.0.3" + chewie: + dependency: transitive + description: + name: chewie + sha256: "335df378c025588aef400c704bd71f0daea479d4cd57c471c88c056c1144e7cd" + url: "https://pub.dev" + source: hosted + version: "1.8.5" cli_util: dependency: transitive description: @@ -468,6 +508,14 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_cache_manager: + dependency: transitive + description: + name: flutter_cache_manager + sha256: "400b6592f16a4409a7f2bb929a9a7e38c72cceb8ffb99ee57bbf2cb2cecf8386" + url: "https://pub.dev" + source: hosted + version: "3.4.1" flutter_code_editor: dependency: "direct main" description: @@ -484,14 +532,6 @@ packages: url: "https://pub.dev" source: hosted version: "0.7.0" - flutter_html: - dependency: "direct main" - description: - name: flutter_html - sha256: "02ad69e813ecfc0728a455e4bf892b9379983e050722b1dce00192ee2e41d1ee" - url: "https://pub.dev" - source: hosted - version: "3.0.0-beta.2" flutter_inappwebview: dependency: "direct main" description: @@ -610,6 +650,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.7.0" + flutter_svg: + dependency: transitive + description: + name: flutter_svg + sha256: "54900a1a1243f3c4a5506d853a2b5c2dbc38d5f27e52a52618a8054401431123" + url: "https://pub.dev" + source: hosted + version: "2.0.16" flutter_test: dependency: "direct dev" description: flutter @@ -636,6 +684,22 @@ packages: description: flutter source: sdk version: "0.0.0" + flutter_widget_from_html: + dependency: "direct main" + description: + name: flutter_widget_from_html + sha256: f3967a5b42896662efdd420b5adaf8a7d3692b0f44462a07c80e3b4c173b1a02 + url: "https://pub.dev" + source: hosted + version: "0.15.3" + flutter_widget_from_html_core: + dependency: transitive + description: + name: flutter_widget_from_html_core + sha256: b1048fd119a14762e2361bd057da608148a895477846d6149109b2151d2f7abf + url: "https://pub.dev" + source: hosted + version: "0.15.2" font_awesome_flutter: dependency: "direct main" description: @@ -668,6 +732,54 @@ packages: url: "https://pub.dev" source: hosted version: "4.0.0" + fwfh_cached_network_image: + dependency: transitive + description: + name: fwfh_cached_network_image + sha256: "8e44226801bfba27930673953afce8af44da7e92573be93f60385d9865a089dd" + url: "https://pub.dev" + source: hosted + version: "0.14.3" + fwfh_chewie: + dependency: transitive + description: + name: fwfh_chewie + sha256: "37bde9cedfb6dc5546176f7f0c56af1e814966cb33ec58f16c9565ed93ccb704" + url: "https://pub.dev" + source: hosted + version: "0.14.8" + fwfh_just_audio: + dependency: transitive + description: + name: fwfh_just_audio + sha256: "38dc2c55803bd3cef33042c473e0c40b891ad4548078424641a32032f6a1245f" + url: "https://pub.dev" + source: hosted + version: "0.15.2" + fwfh_svg: + dependency: transitive + description: + name: fwfh_svg + sha256: "550b1014d12b5528d8bdb6e3b44b58721f3fb1f65d7a852d1623a817008bdfc4" + url: "https://pub.dev" + source: hosted + version: "0.8.3" + fwfh_url_launcher: + dependency: transitive + description: + name: fwfh_url_launcher + sha256: b9f5d55a5ae2c2c07243ba33f7ba49ac9544bdb2f4c16d8139df9ccbebe3449c + url: "https://pub.dev" + source: hosted + version: "0.9.1" + fwfh_webview: + dependency: transitive + description: + name: fwfh_webview + sha256: c0a8b664b642f40f4c252a0ab4e72c22dcd97c7fb3a7e50a6b4bdb6f63afca19 + url: "https://pub.dev" + source: hosted + version: "0.15.3" glob: dependency: transitive description: @@ -876,6 +988,30 @@ packages: url: "https://pub.dev" source: hosted version: "0.4.2" + just_audio: + dependency: transitive + description: + name: just_audio + sha256: a49e7120b95600bd357f37a2bb04cd1e88252f7cdea8f3368803779b925b1049 + url: "https://pub.dev" + source: hosted + version: "0.9.42" + just_audio_platform_interface: + dependency: transitive + description: + name: just_audio_platform_interface + sha256: "0243828cce503c8366cc2090cefb2b3c871aa8ed2f520670d76fd47aa1ab2790" + url: "https://pub.dev" + source: hosted + version: "4.3.0" + just_audio_web: + dependency: transitive + description: + name: just_audio_web + sha256: "9a98035b8b24b40749507687520ec5ab404e291d2b0937823ff45d92cb18d448" + url: "https://pub.dev" + source: hosted + version: "0.4.13" lazy_memo: dependency: transitive description: @@ -924,14 +1060,6 @@ packages: url: "https://pub.dev" source: hosted version: "5.1.0" - list_counter: - dependency: transitive - description: - name: list_counter - sha256: c447ae3dfcd1c55f0152867090e67e219d42fe6d4f2807db4bbe8b8d69912237 - url: "https://pub.dev" - source: hosted - version: "1.0.2" logging: dependency: transitive description: @@ -1071,6 +1199,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.0.4" + nested: + dependency: transitive + description: + name: nested + sha256: "03bac4c528c64c95c722ec99280375a6f2fc708eec17c7b3f07253b626cd2a20" + url: "https://pub.dev" + source: hosted + version: "1.0.0" numberpicker: dependency: "direct main" description: @@ -1079,6 +1215,14 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.2" + octo_image: + dependency: transitive + description: + name: octo_image + sha256: "34faa6639a78c7e3cbe79be6f9f96535867e879748ade7d17c9b1ae7536293bd" + url: "https://pub.dev" + source: hosted + version: "2.1.0" package_config: dependency: transitive description: @@ -1111,6 +1255,14 @@ packages: url: "https://pub.dev" source: hosted version: "1.9.0" + path_parsing: + dependency: transitive + description: + name: path_parsing + sha256: "883402936929eac138ee0a45da5b0f2c80f89913e6dc3bf77eb65b84b409c6ca" + url: "https://pub.dev" + source: hosted + version: "1.1.0" path_provider: dependency: "direct main" description: @@ -1263,6 +1415,14 @@ packages: url: "https://pub.dev" source: hosted version: "6.0.1" + provider: + dependency: transitive + description: + name: provider + sha256: c8a055ee5ce3fd98d6fc872478b03823ffdb448699c6ebdbbc71d59b596fd48c + url: "https://pub.dev" + source: hosted + version: "6.1.2" pseudom: dependency: "direct main" description: @@ -1523,6 +1683,46 @@ packages: url: "https://pub.dev" source: hosted version: "7.0.0" + sqflite: + dependency: transitive + description: + name: sqflite + sha256: "2d7299468485dca85efeeadf5d38986909c5eb0cd71fd3db2c2f000e6c9454bb" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + sqflite_android: + dependency: transitive + description: + name: sqflite_android + sha256: "78f489aab276260cdd26676d2169446c7ecd3484bbd5fead4ca14f3ed4dd9ee3" + url: "https://pub.dev" + source: hosted + version: "2.4.0" + sqflite_common: + dependency: transitive + description: + name: sqflite_common + sha256: "761b9740ecbd4d3e66b8916d784e581861fd3c3553eda85e167bc49fdb68f709" + url: "https://pub.dev" + source: hosted + version: "2.5.4+6" + sqflite_darwin: + dependency: transitive + description: + name: sqflite_darwin + sha256: "96a698e2bc82bd770a4d6aab00b42396a7c63d9e33513a56945cbccb594c2474" + url: "https://pub.dev" + source: hosted + version: "2.4.1" + sqflite_platform_interface: + dependency: transitive + description: + name: sqflite_platform_interface + sha256: "8dd4515c7bdcae0a785b0062859336de775e8c65db81ae33dd5445f35be61920" + url: "https://pub.dev" + source: hosted + version: "2.4.0" stack_trace: dependency: transitive description: @@ -1715,6 +1915,30 @@ packages: url: "https://pub.dev" source: hosted version: "4.5.1" + vector_graphics: + dependency: transitive + description: + name: vector_graphics + sha256: "27d5fefe86fb9aace4a9f8375b56b3c292b64d8c04510df230f849850d912cb7" + url: "https://pub.dev" + source: hosted + version: "1.1.15" + vector_graphics_codec: + dependency: transitive + description: + name: vector_graphics_codec + sha256: "2430b973a4ca3c4dbc9999b62b8c719a160100dcbae5c819bae0cacce32c9cdb" + url: "https://pub.dev" + source: hosted + version: "1.1.12" + vector_graphics_compiler: + dependency: transitive + description: + name: vector_graphics_compiler + sha256: "1b4b9e706a10294258727674a340ae0d6e64a7231980f9f9a3d12e4b42407aad" + url: "https://pub.dev" + source: hosted + version: "1.1.16" vector_math: dependency: transitive description: @@ -1723,6 +1947,46 @@ packages: url: "https://pub.dev" source: hosted version: "2.1.4" + video_player: + dependency: transitive + description: + name: video_player + sha256: "4a8c3492d734f7c39c2588a3206707a05ee80cef52e8c7f3b2078d430c84bc17" + url: "https://pub.dev" + source: hosted + version: "2.9.2" + video_player_android: + dependency: transitive + description: + name: video_player_android + sha256: "391e092ba4abe2f93b3e625bd6b6a6ec7d7414279462c1c0ee42b5ab8d0a0898" + url: "https://pub.dev" + source: hosted + version: "2.7.16" + video_player_avfoundation: + dependency: transitive + description: + name: video_player_avfoundation + sha256: "33224c19775fd244be2d6e3dbd8e1826ab162877bd61123bf71890772119a2b7" + url: "https://pub.dev" + source: hosted + version: "2.6.5" + video_player_platform_interface: + dependency: transitive + description: + name: video_player_platform_interface + sha256: "229d7642ccd9f3dc4aba169609dd6b5f3f443bb4cc15b82f7785fcada5af9bbb" + url: "https://pub.dev" + source: hosted + version: "6.2.3" + video_player_web: + dependency: transitive + description: + name: video_player_web + sha256: "881b375a934d8ebf868c7fb1423b2bfaa393a0a265fa3f733079a86536064a10" + url: "https://pub.dev" + source: hosted + version: "2.3.3" vm_service: dependency: transitive description: @@ -1787,6 +2051,38 @@ packages: url: "https://pub.dev" source: hosted version: "3.0.1" + webview_flutter: + dependency: transitive + description: + name: webview_flutter + sha256: "889a0a678e7c793c308c68739996227c9661590605e70b1f6cf6b9a6634f7aec" + url: "https://pub.dev" + source: hosted + version: "4.10.0" + webview_flutter_android: + dependency: transitive + description: + name: webview_flutter_android + sha256: "3d535126f7244871542b2f0b0fcf94629c9a14883250461f9abe1a6644c1c379" + url: "https://pub.dev" + source: hosted + version: "4.2.0" + webview_flutter_platform_interface: + dependency: transitive + description: + name: webview_flutter_platform_interface + sha256: d937581d6e558908d7ae3dc1989c4f87b786891ab47bb9df7de548a151779d8d + url: "https://pub.dev" + source: hosted + version: "2.10.0" + webview_flutter_wkwebview: + dependency: transitive + description: + name: webview_flutter_wkwebview + sha256: b7e92f129482460951d96ef9a46b49db34bd2e1621685de26e9eaafd9674e7eb + url: "https://pub.dev" + source: hosted + version: "3.16.3" win32: dependency: transitive description: diff --git a/pubspec.yaml b/pubspec.yaml index d3b1e3f..38150af 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -78,7 +78,7 @@ dependencies: path: packages/desktop_webview_window ref: main screen_brightness: ^2.0.1 - flutter_html: ^3.0.0-beta.2 + flutter_widget_from_html: ^0.15.3 dependency_overrides: http: ^1.2.2 From 3bc85cf5aa36b8a5c5354feca1fd4faf8d63a0c7 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sat, 21 Dec 2024 21:18:21 +0100 Subject: [PATCH 14/18] saving novel chapter progress + removed sync for now --- lib/main.dart | 6 - lib/models/changed_items.dart | 86 - lib/models/changed_items.g.dart | 1555 ----------------- lib/models/settings.dart | 10 - lib/models/settings.g.dart | 176 +- lib/modules/anime/anime_player_view.dart | 1 - .../anime_player_controller_provider.dart | 12 - .../anime_player_controller_provider.g.dart | 2 +- lib/modules/history/history_screen.dart | 18 - lib/modules/library/library_screen.dart | 12 - .../providers/library_state_provider.dart | 7 - .../providers/library_state_provider.g.dart | 4 +- .../manga/detail/manga_detail_view.dart | 17 - .../detail/providers/state_providers.dart | 7 - .../detail/providers/state_providers.g.dart | 4 +- .../update_manga_detail_providers.dart | 7 - .../update_manga_detail_providers.g.dart | 2 +- .../providers/reader_controller_provider.dart | 15 - .../reader_controller_provider.g.dart | 2 +- lib/modules/manga/reader/reader_view.dart | 1 - .../widgets/btn_chapter_list_dialog.dart | 3 - .../more/categories/categories_screen.dart | 10 - .../sync/providers/sync_providers.dart | 239 --- .../sync/providers/sync_providers.g.dart | 482 +---- lib/modules/more/settings/sync/sync.dart | 50 - .../novel_reader_controller_provider.dart | 19 +- .../novel_reader_controller_provider.g.dart | 2 +- lib/modules/novel/novel_reader_view.dart | 137 +- lib/providers/storage_provider.dart | 2 - lib/services/get_html_content.dart | 2 +- lib/services/get_html_content.g.dart | 2 +- lib/services/sync_server.dart | 209 --- lib/services/sync_server.g.dart | 2 +- 33 files changed, 141 insertions(+), 2962 deletions(-) delete mode 100644 lib/models/changed_items.dart delete mode 100644 lib/models/changed_items.g.dart diff --git a/lib/main.dart b/lib/main.dart index dcb5051..e88e328 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -18,8 +18,6 @@ import 'package:mangayomi/modules/more/settings/appearance/providers/blend_level import 'package:mangayomi/modules/more/settings/appearance/providers/flex_scheme_color_state_provider.dart'; import 'package:mangayomi/modules/more/settings/appearance/providers/pure_black_dark_mode_state_provider.dart'; import 'package:mangayomi/modules/more/settings/appearance/providers/theme_mode_state_provider.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; -import 'package:mangayomi/services/sync_server.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:mangayomi/src/rust/frb_generated.dart'; import 'package:media_kit/media_kit.dart'; @@ -82,10 +80,6 @@ class _MyAppState extends ConsumerState { @override Widget build(BuildContext context) { - final syncOnAppLaunch = ref.watch(syncOnAppLaunchStateProvider); - if (syncOnAppLaunch) { - ref.read(syncServerProvider(syncId: 1).notifier).checkForSync(true); - } final isDarkTheme = ref.watch(themeModeStateProvider); final blendLevel = ref.watch(blendLevelStateProvider); final appFontFamily = ref.watch(appFontFamilyProvider); diff --git a/lib/models/changed_items.dart b/lib/models/changed_items.dart deleted file mode 100644 index 60555df..0000000 --- a/lib/models/changed_items.dart +++ /dev/null @@ -1,86 +0,0 @@ -import 'package:isar/isar.dart'; -part 'changed_items.g.dart'; - -@collection -@Name("Changed Items") -class ChangedItems { - Id? id; - List? deletedMangas; - List? updatedChapters; - List? deletedCategories; - ChangedItems( - {this.id = Isar.autoIncrement, - this.deletedMangas = const [], - this.updatedChapters = const [], - this.deletedCategories = const []}); - - ChangedItems.fromJson(Map json) { - id = json['id']; - deletedMangas = json['deletedMangas']; - updatedChapters = json['updatedChapters']; - deletedCategories = json['deletedCategories']; - } - - Map toJson() => { - 'id': id, - 'deletedMangas': deletedMangas, - 'updatedChapters': updatedChapters, - 'deletedCategories': deletedCategories - }; -} - -@embedded -class DeletedManga { - int? mangaId; - DeletedManga({this.mangaId}); - DeletedManga.fromJson(Map json) { - mangaId = json['mangaId']; - } - - Map toJson() => {'mangaId': mangaId}; -} - -@embedded -class UpdatedChapter { - int? chapterId; - int? mangaId; - bool? isBookmarked; - bool? isRead; - String? lastPageRead; - bool? deleted; - UpdatedChapter( - {this.chapterId, - this.mangaId, - this.isBookmarked, - this.isRead, - this.lastPageRead, - this.deleted}); - UpdatedChapter.fromJson(Map json) { - chapterId = json['chapterId']; - mangaId = json['mangaId']; - isBookmarked = json['isBookmarked']; - isRead = json['isRead']; - lastPageRead = json['lastPageRead']; - deleted = json['deleted']; - } - - Map toJson() => { - 'chapterId': chapterId, - 'mangaId': mangaId, - 'isBookmarked': isBookmarked, - 'isRead': isRead, - 'lastPageRead': lastPageRead, - 'deleted': deleted - }; -} - -@embedded -class DeletedCategory { - int? categoryId; - DeletedCategory({this.categoryId}); - DeletedCategory.fromJson(Map json) { - categoryId = json['categoryId']; - } - - Map toJson() => {'categoryId': categoryId}; -} diff --git a/lib/models/changed_items.g.dart b/lib/models/changed_items.g.dart deleted file mode 100644 index 16a1754..0000000 --- a/lib/models/changed_items.g.dart +++ /dev/null @@ -1,1555 +0,0 @@ -// GENERATED CODE - DO NOT MODIFY BY HAND - -part of 'changed_items.dart'; - -// ************************************************************************** -// IsarCollectionGenerator -// ************************************************************************** - -// coverage:ignore-file -// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types - -extension GetChangedItemsCollection on Isar { - IsarCollection get changedItems => this.collection(); -} - -const ChangedItemsSchema = CollectionSchema( - name: r'Changed Items', - id: 5738738771983667580, - properties: { - r'deletedCategories': PropertySchema( - id: 0, - name: r'deletedCategories', - type: IsarType.objectList, - target: r'DeletedCategory', - ), - r'deletedMangas': PropertySchema( - id: 1, - name: r'deletedMangas', - type: IsarType.objectList, - target: r'DeletedManga', - ), - r'updatedChapters': PropertySchema( - id: 2, - name: r'updatedChapters', - type: IsarType.objectList, - target: r'UpdatedChapter', - ) - }, - estimateSize: _changedItemsEstimateSize, - serialize: _changedItemsSerialize, - deserialize: _changedItemsDeserialize, - deserializeProp: _changedItemsDeserializeProp, - idName: r'id', - indexes: {}, - links: {}, - embeddedSchemas: { - r'DeletedManga': DeletedMangaSchema, - r'UpdatedChapter': UpdatedChapterSchema, - r'DeletedCategory': DeletedCategorySchema - }, - getId: _changedItemsGetId, - getLinks: _changedItemsGetLinks, - attach: _changedItemsAttach, - version: '3.1.0+1', -); - -int _changedItemsEstimateSize( - ChangedItems object, - List offsets, - Map> allOffsets, -) { - var bytesCount = offsets.last; - { - final list = object.deletedCategories; - if (list != null) { - bytesCount += 3 + list.length * 3; - { - final offsets = allOffsets[DeletedCategory]!; - for (var i = 0; i < list.length; i++) { - final value = list[i]; - bytesCount += - DeletedCategorySchema.estimateSize(value, offsets, allOffsets); - } - } - } - } - { - final list = object.deletedMangas; - if (list != null) { - bytesCount += 3 + list.length * 3; - { - final offsets = allOffsets[DeletedManga]!; - for (var i = 0; i < list.length; i++) { - final value = list[i]; - bytesCount += - DeletedMangaSchema.estimateSize(value, offsets, allOffsets); - } - } - } - } - { - final list = object.updatedChapters; - if (list != null) { - bytesCount += 3 + list.length * 3; - { - final offsets = allOffsets[UpdatedChapter]!; - for (var i = 0; i < list.length; i++) { - final value = list[i]; - bytesCount += - UpdatedChapterSchema.estimateSize(value, offsets, allOffsets); - } - } - } - } - return bytesCount; -} - -void _changedItemsSerialize( - ChangedItems object, - IsarWriter writer, - List offsets, - Map> allOffsets, -) { - writer.writeObjectList( - offsets[0], - allOffsets, - DeletedCategorySchema.serialize, - object.deletedCategories, - ); - writer.writeObjectList( - offsets[1], - allOffsets, - DeletedMangaSchema.serialize, - object.deletedMangas, - ); - writer.writeObjectList( - offsets[2], - allOffsets, - UpdatedChapterSchema.serialize, - object.updatedChapters, - ); -} - -ChangedItems _changedItemsDeserialize( - Id id, - IsarReader reader, - List offsets, - Map> allOffsets, -) { - final object = ChangedItems( - deletedCategories: reader.readObjectList( - offsets[0], - DeletedCategorySchema.deserialize, - allOffsets, - DeletedCategory(), - ), - deletedMangas: reader.readObjectList( - offsets[1], - DeletedMangaSchema.deserialize, - allOffsets, - DeletedManga(), - ), - id: id, - updatedChapters: reader.readObjectList( - offsets[2], - UpdatedChapterSchema.deserialize, - allOffsets, - UpdatedChapter(), - ), - ); - return object; -} - -P _changedItemsDeserializeProp

( - IsarReader reader, - int propertyId, - int offset, - Map> allOffsets, -) { - switch (propertyId) { - case 0: - return (reader.readObjectList( - offset, - DeletedCategorySchema.deserialize, - allOffsets, - DeletedCategory(), - )) as P; - case 1: - return (reader.readObjectList( - offset, - DeletedMangaSchema.deserialize, - allOffsets, - DeletedManga(), - )) as P; - case 2: - return (reader.readObjectList( - offset, - UpdatedChapterSchema.deserialize, - allOffsets, - UpdatedChapter(), - )) as P; - default: - throw IsarError('Unknown property with id $propertyId'); - } -} - -Id _changedItemsGetId(ChangedItems object) { - return object.id ?? Isar.autoIncrement; -} - -List> _changedItemsGetLinks(ChangedItems object) { - return []; -} - -void _changedItemsAttach( - IsarCollection col, Id id, ChangedItems object) { - object.id = id; -} - -extension ChangedItemsQueryWhereSort - on QueryBuilder { - QueryBuilder anyId() { - return QueryBuilder.apply(this, (query) { - return query.addWhereClause(const IdWhereClause.any()); - }); - } -} - -extension ChangedItemsQueryWhere - on QueryBuilder { - QueryBuilder idEqualTo(Id id) { - return QueryBuilder.apply(this, (query) { - return query.addWhereClause(IdWhereClause.between( - lower: id, - upper: id, - )); - }); - } - - QueryBuilder idNotEqualTo( - Id id) { - return QueryBuilder.apply(this, (query) { - if (query.whereSort == Sort.asc) { - return query - .addWhereClause( - IdWhereClause.lessThan(upper: id, includeUpper: false), - ) - .addWhereClause( - IdWhereClause.greaterThan(lower: id, includeLower: false), - ); - } else { - return query - .addWhereClause( - IdWhereClause.greaterThan(lower: id, includeLower: false), - ) - .addWhereClause( - IdWhereClause.lessThan(upper: id, includeUpper: false), - ); - } - }); - } - - QueryBuilder idGreaterThan( - Id id, - {bool include = false}) { - return QueryBuilder.apply(this, (query) { - return query.addWhereClause( - IdWhereClause.greaterThan(lower: id, includeLower: include), - ); - }); - } - - QueryBuilder idLessThan(Id id, - {bool include = false}) { - return QueryBuilder.apply(this, (query) { - return query.addWhereClause( - IdWhereClause.lessThan(upper: id, includeUpper: include), - ); - }); - } - - QueryBuilder idBetween( - Id lowerId, - Id upperId, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addWhereClause(IdWhereClause.between( - lower: lowerId, - includeLower: includeLower, - upper: upperId, - includeUpper: includeUpper, - )); - }); - } -} - -extension ChangedItemsQueryFilter - on QueryBuilder { - QueryBuilder - deletedCategoriesIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'deletedCategories', - )); - }); - } - - QueryBuilder - deletedCategoriesIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'deletedCategories', - )); - }); - } - - QueryBuilder - deletedCategoriesLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedCategories', - length, - true, - length, - true, - ); - }); - } - - QueryBuilder - deletedCategoriesIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedCategories', - 0, - true, - 0, - true, - ); - }); - } - - QueryBuilder - deletedCategoriesIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedCategories', - 0, - false, - 999999, - true, - ); - }); - } - - QueryBuilder - deletedCategoriesLengthLessThan( - int length, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedCategories', - 0, - true, - length, - include, - ); - }); - } - - QueryBuilder - deletedCategoriesLengthGreaterThan( - int length, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedCategories', - length, - include, - 999999, - true, - ); - }); - } - - QueryBuilder - deletedCategoriesLengthBetween( - int lower, - int upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedCategories', - lower, - includeLower, - upper, - includeUpper, - ); - }); - } - - QueryBuilder - deletedMangasIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'deletedMangas', - )); - }); - } - - QueryBuilder - deletedMangasIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'deletedMangas', - )); - }); - } - - QueryBuilder - deletedMangasLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedMangas', - length, - true, - length, - true, - ); - }); - } - - QueryBuilder - deletedMangasIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedMangas', - 0, - true, - 0, - true, - ); - }); - } - - QueryBuilder - deletedMangasIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedMangas', - 0, - false, - 999999, - true, - ); - }); - } - - QueryBuilder - deletedMangasLengthLessThan( - int length, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedMangas', - 0, - true, - length, - include, - ); - }); - } - - QueryBuilder - deletedMangasLengthGreaterThan( - int length, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedMangas', - length, - include, - 999999, - true, - ); - }); - } - - QueryBuilder - deletedMangasLengthBetween( - int lower, - int upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'deletedMangas', - lower, - includeLower, - upper, - includeUpper, - ); - }); - } - - QueryBuilder idIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'id', - )); - }); - } - - QueryBuilder - idIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'id', - )); - }); - } - - QueryBuilder idEqualTo( - Id? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'id', - value: value, - )); - }); - } - - QueryBuilder idGreaterThan( - Id? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'id', - value: value, - )); - }); - } - - QueryBuilder idLessThan( - Id? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'id', - value: value, - )); - }); - } - - QueryBuilder idBetween( - Id? lower, - Id? upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'id', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); - }); - } - - QueryBuilder - updatedChaptersIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'updatedChapters', - )); - }); - } - - QueryBuilder - updatedChaptersIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'updatedChapters', - )); - }); - } - - QueryBuilder - updatedChaptersLengthEqualTo(int length) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'updatedChapters', - length, - true, - length, - true, - ); - }); - } - - QueryBuilder - updatedChaptersIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'updatedChapters', - 0, - true, - 0, - true, - ); - }); - } - - QueryBuilder - updatedChaptersIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'updatedChapters', - 0, - false, - 999999, - true, - ); - }); - } - - QueryBuilder - updatedChaptersLengthLessThan( - int length, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'updatedChapters', - 0, - true, - length, - include, - ); - }); - } - - QueryBuilder - updatedChaptersLengthGreaterThan( - int length, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'updatedChapters', - length, - include, - 999999, - true, - ); - }); - } - - QueryBuilder - updatedChaptersLengthBetween( - int lower, - int upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.listLength( - r'updatedChapters', - lower, - includeLower, - upper, - includeUpper, - ); - }); - } -} - -extension ChangedItemsQueryObject - on QueryBuilder { - QueryBuilder - deletedCategoriesElement(FilterQuery q) { - return QueryBuilder.apply(this, (query) { - return query.object(q, r'deletedCategories'); - }); - } - - QueryBuilder - deletedMangasElement(FilterQuery q) { - return QueryBuilder.apply(this, (query) { - return query.object(q, r'deletedMangas'); - }); - } - - QueryBuilder - updatedChaptersElement(FilterQuery q) { - return QueryBuilder.apply(this, (query) { - return query.object(q, r'updatedChapters'); - }); - } -} - -extension ChangedItemsQueryLinks - on QueryBuilder {} - -extension ChangedItemsQuerySortBy - on QueryBuilder {} - -extension ChangedItemsQuerySortThenBy - on QueryBuilder { - QueryBuilder thenById() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'id', Sort.asc); - }); - } - - QueryBuilder thenByIdDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'id', Sort.desc); - }); - } -} - -extension ChangedItemsQueryWhereDistinct - on QueryBuilder {} - -extension ChangedItemsQueryProperty - on QueryBuilder { - QueryBuilder idProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'id'); - }); - } - - QueryBuilder?, QQueryOperations> - deletedCategoriesProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'deletedCategories'); - }); - } - - QueryBuilder?, QQueryOperations> - deletedMangasProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'deletedMangas'); - }); - } - - QueryBuilder?, QQueryOperations> - updatedChaptersProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'updatedChapters'); - }); - } -} - -// ************************************************************************** -// IsarEmbeddedGenerator -// ************************************************************************** - -// coverage:ignore-file -// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types - -const DeletedMangaSchema = Schema( - name: r'DeletedManga', - id: -4943524126252993118, - properties: { - r'mangaId': PropertySchema( - id: 0, - name: r'mangaId', - type: IsarType.long, - ) - }, - estimateSize: _deletedMangaEstimateSize, - serialize: _deletedMangaSerialize, - deserialize: _deletedMangaDeserialize, - deserializeProp: _deletedMangaDeserializeProp, -); - -int _deletedMangaEstimateSize( - DeletedManga object, - List offsets, - Map> allOffsets, -) { - var bytesCount = offsets.last; - return bytesCount; -} - -void _deletedMangaSerialize( - DeletedManga object, - IsarWriter writer, - List offsets, - Map> allOffsets, -) { - writer.writeLong(offsets[0], object.mangaId); -} - -DeletedManga _deletedMangaDeserialize( - Id id, - IsarReader reader, - List offsets, - Map> allOffsets, -) { - final object = DeletedManga( - mangaId: reader.readLongOrNull(offsets[0]), - ); - return object; -} - -P _deletedMangaDeserializeProp

( - IsarReader reader, - int propertyId, - int offset, - Map> allOffsets, -) { - switch (propertyId) { - case 0: - return (reader.readLongOrNull(offset)) as P; - default: - throw IsarError('Unknown property with id $propertyId'); - } -} - -extension DeletedMangaQueryFilter - on QueryBuilder { - QueryBuilder - mangaIdIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'mangaId', - )); - }); - } - - QueryBuilder - mangaIdIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'mangaId', - )); - }); - } - - QueryBuilder - mangaIdEqualTo(int? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'mangaId', - value: value, - )); - }); - } - - QueryBuilder - mangaIdGreaterThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'mangaId', - value: value, - )); - }); - } - - QueryBuilder - mangaIdLessThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'mangaId', - value: value, - )); - }); - } - - QueryBuilder - mangaIdBetween( - int? lower, - int? upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'mangaId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); - }); - } -} - -extension DeletedMangaQueryObject - on QueryBuilder {} - -// coverage:ignore-file -// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types - -const UpdatedChapterSchema = Schema( - name: r'UpdatedChapter', - id: -1728004238049586930, - properties: { - r'chapterId': PropertySchema( - id: 0, - name: r'chapterId', - type: IsarType.long, - ), - r'deleted': PropertySchema( - id: 1, - name: r'deleted', - type: IsarType.bool, - ), - r'isBookmarked': PropertySchema( - id: 2, - name: r'isBookmarked', - type: IsarType.bool, - ), - r'isRead': PropertySchema( - id: 3, - name: r'isRead', - type: IsarType.bool, - ), - r'lastPageRead': PropertySchema( - id: 4, - name: r'lastPageRead', - type: IsarType.string, - ), - r'mangaId': PropertySchema( - id: 5, - name: r'mangaId', - type: IsarType.long, - ) - }, - estimateSize: _updatedChapterEstimateSize, - serialize: _updatedChapterSerialize, - deserialize: _updatedChapterDeserialize, - deserializeProp: _updatedChapterDeserializeProp, -); - -int _updatedChapterEstimateSize( - UpdatedChapter object, - List offsets, - Map> allOffsets, -) { - var bytesCount = offsets.last; - { - final value = object.lastPageRead; - if (value != null) { - bytesCount += 3 + value.length * 3; - } - } - return bytesCount; -} - -void _updatedChapterSerialize( - UpdatedChapter object, - IsarWriter writer, - List offsets, - Map> allOffsets, -) { - writer.writeLong(offsets[0], object.chapterId); - writer.writeBool(offsets[1], object.deleted); - writer.writeBool(offsets[2], object.isBookmarked); - writer.writeBool(offsets[3], object.isRead); - writer.writeString(offsets[4], object.lastPageRead); - writer.writeLong(offsets[5], object.mangaId); -} - -UpdatedChapter _updatedChapterDeserialize( - Id id, - IsarReader reader, - List offsets, - Map> allOffsets, -) { - final object = UpdatedChapter( - chapterId: reader.readLongOrNull(offsets[0]), - deleted: reader.readBoolOrNull(offsets[1]), - isBookmarked: reader.readBoolOrNull(offsets[2]), - isRead: reader.readBoolOrNull(offsets[3]), - lastPageRead: reader.readStringOrNull(offsets[4]), - mangaId: reader.readLongOrNull(offsets[5]), - ); - return object; -} - -P _updatedChapterDeserializeProp

( - IsarReader reader, - int propertyId, - int offset, - Map> allOffsets, -) { - switch (propertyId) { - case 0: - return (reader.readLongOrNull(offset)) as P; - case 1: - return (reader.readBoolOrNull(offset)) as P; - case 2: - return (reader.readBoolOrNull(offset)) as P; - case 3: - return (reader.readBoolOrNull(offset)) as P; - case 4: - return (reader.readStringOrNull(offset)) as P; - case 5: - return (reader.readLongOrNull(offset)) as P; - default: - throw IsarError('Unknown property with id $propertyId'); - } -} - -extension UpdatedChapterQueryFilter - on QueryBuilder { - QueryBuilder - chapterIdIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'chapterId', - )); - }); - } - - QueryBuilder - chapterIdIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'chapterId', - )); - }); - } - - QueryBuilder - chapterIdEqualTo(int? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'chapterId', - value: value, - )); - }); - } - - QueryBuilder - chapterIdGreaterThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'chapterId', - value: value, - )); - }); - } - - QueryBuilder - chapterIdLessThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'chapterId', - value: value, - )); - }); - } - - QueryBuilder - chapterIdBetween( - int? lower, - int? upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'chapterId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); - }); - } - - QueryBuilder - deletedIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'deleted', - )); - }); - } - - QueryBuilder - deletedIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'deleted', - )); - }); - } - - QueryBuilder - deletedEqualTo(bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'deleted', - value: value, - )); - }); - } - - QueryBuilder - isBookmarkedIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isBookmarked', - )); - }); - } - - QueryBuilder - isBookmarkedIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isBookmarked', - )); - }); - } - - QueryBuilder - isBookmarkedEqualTo(bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isBookmarked', - value: value, - )); - }); - } - - QueryBuilder - isReadIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'isRead', - )); - }); - } - - QueryBuilder - isReadIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'isRead', - )); - }); - } - - QueryBuilder - isReadEqualTo(bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'isRead', - value: value, - )); - }); - } - - QueryBuilder - lastPageReadIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'lastPageRead', - )); - }); - } - - QueryBuilder - lastPageReadIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'lastPageRead', - )); - }); - } - - QueryBuilder - lastPageReadEqualTo( - String? value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadGreaterThan( - String? value, { - bool include = false, - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadLessThan( - String? value, { - bool include = false, - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadBetween( - String? lower, - String? upper, { - bool includeLower = true, - bool includeUpper = true, - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'lastPageRead', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadStartsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.startsWith( - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadEndsWith( - String value, { - bool caseSensitive = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.endsWith( - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadContains(String value, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.contains( - property: r'lastPageRead', - value: value, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadMatches(String pattern, {bool caseSensitive = true}) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.matches( - property: r'lastPageRead', - wildcard: pattern, - caseSensitive: caseSensitive, - )); - }); - } - - QueryBuilder - lastPageReadIsEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'lastPageRead', - value: '', - )); - }); - } - - QueryBuilder - lastPageReadIsNotEmpty() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - property: r'lastPageRead', - value: '', - )); - }); - } - - QueryBuilder - mangaIdIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'mangaId', - )); - }); - } - - QueryBuilder - mangaIdIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'mangaId', - )); - }); - } - - QueryBuilder - mangaIdEqualTo(int? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'mangaId', - value: value, - )); - }); - } - - QueryBuilder - mangaIdGreaterThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'mangaId', - value: value, - )); - }); - } - - QueryBuilder - mangaIdLessThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'mangaId', - value: value, - )); - }); - } - - QueryBuilder - mangaIdBetween( - int? lower, - int? upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'mangaId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); - }); - } -} - -extension UpdatedChapterQueryObject - on QueryBuilder {} - -// coverage:ignore-file -// ignore_for_file: duplicate_ignore, non_constant_identifier_names, constant_identifier_names, invalid_use_of_protected_member, unnecessary_cast, prefer_const_constructors, lines_longer_than_80_chars, require_trailing_commas, inference_failure_on_function_invocation, unnecessary_parenthesis, unnecessary_raw_strings, unnecessary_null_checks, join_return_with_assignment, prefer_final_locals, avoid_js_rounded_ints, avoid_positional_boolean_parameters, always_specify_types - -const DeletedCategorySchema = Schema( - name: r'DeletedCategory', - id: -2357965502277606786, - properties: { - r'categoryId': PropertySchema( - id: 0, - name: r'categoryId', - type: IsarType.long, - ) - }, - estimateSize: _deletedCategoryEstimateSize, - serialize: _deletedCategorySerialize, - deserialize: _deletedCategoryDeserialize, - deserializeProp: _deletedCategoryDeserializeProp, -); - -int _deletedCategoryEstimateSize( - DeletedCategory object, - List offsets, - Map> allOffsets, -) { - var bytesCount = offsets.last; - return bytesCount; -} - -void _deletedCategorySerialize( - DeletedCategory object, - IsarWriter writer, - List offsets, - Map> allOffsets, -) { - writer.writeLong(offsets[0], object.categoryId); -} - -DeletedCategory _deletedCategoryDeserialize( - Id id, - IsarReader reader, - List offsets, - Map> allOffsets, -) { - final object = DeletedCategory( - categoryId: reader.readLongOrNull(offsets[0]), - ); - return object; -} - -P _deletedCategoryDeserializeProp

( - IsarReader reader, - int propertyId, - int offset, - Map> allOffsets, -) { - switch (propertyId) { - case 0: - return (reader.readLongOrNull(offset)) as P; - default: - throw IsarError('Unknown property with id $propertyId'); - } -} - -extension DeletedCategoryQueryFilter - on QueryBuilder { - QueryBuilder - categoryIdIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'categoryId', - )); - }); - } - - QueryBuilder - categoryIdIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'categoryId', - )); - }); - } - - QueryBuilder - categoryIdEqualTo(int? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'categoryId', - value: value, - )); - }); - } - - QueryBuilder - categoryIdGreaterThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.greaterThan( - include: include, - property: r'categoryId', - value: value, - )); - }); - } - - QueryBuilder - categoryIdLessThan( - int? value, { - bool include = false, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.lessThan( - include: include, - property: r'categoryId', - value: value, - )); - }); - } - - QueryBuilder - categoryIdBetween( - int? lower, - int? upper, { - bool includeLower = true, - bool includeUpper = true, - }) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.between( - property: r'categoryId', - lower: lower, - includeLower: includeLower, - upper: upper, - includeUpper: includeUpper, - )); - }); - } -} - -extension DeletedCategoryQueryObject - on QueryBuilder {} diff --git a/lib/models/settings.dart b/lib/models/settings.dart index cf1fa24..4d5a173 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -135,10 +135,6 @@ class Settings { List? backupFrequencyOptions; - bool? syncOnAppLaunch; - - bool? syncAfterReading; - String? autoBackupLocation; bool? usePageTapZones; @@ -276,8 +272,6 @@ class Settings { this.personalPageModeList, this.backupFrequency, this.backupFrequencyOptions, - this.syncOnAppLaunch, - this.syncAfterReading, this.autoBackupLocation, this.startDatebackup, this.usePageTapZones = true, @@ -436,8 +430,6 @@ class Settings { userAgent = json['userAgent']; backupFrequency = json['backupFrequency']; backupFrequencyOptions = json['backupFrequencyOptions']?.cast(); - syncOnAppLaunch = json['syncOnAppLaunch']; - syncAfterReading = json['syncAfterReading']; autoBackupLocation = json['autoBackupLocation']; startDatebackup = json['startDatebackup']; usePageTapZones = json['usePageTapZones']; @@ -559,8 +551,6 @@ class Settings { 'userAgent': userAgent, 'backupFrequency': backupFrequency, 'backupFrequencyOptions': backupFrequencyOptions, - 'syncOnAppLaunch': syncOnAppLaunch, - 'syncAfterReading': syncAfterReading, 'autoBackupLocation': autoBackupLocation, 'startDatebackup': startDatebackup, 'usePageTapZones': usePageTapZones, diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index daa0845..96fd70d 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -508,38 +508,28 @@ const SettingsSchema = CollectionSchema( name: r'startDatebackup', type: IsarType.long, ), - r'syncAfterReading': PropertySchema( - id: 93, - name: r'syncAfterReading', - type: IsarType.bool, - ), - r'syncOnAppLaunch': PropertySchema( - id: 94, - name: r'syncOnAppLaunch', - type: IsarType.bool, - ), r'themeIsDark': PropertySchema( - id: 95, + id: 93, name: r'themeIsDark', type: IsarType.bool, ), r'updateProgressAfterReading': PropertySchema( - id: 96, + id: 94, name: r'updateProgressAfterReading', type: IsarType.bool, ), r'useLibass': PropertySchema( - id: 97, + id: 95, name: r'useLibass', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( - id: 98, + id: 96, name: r'usePageTapZones', type: IsarType.bool, ), r'userAgent': PropertySchema( - id: 99, + id: 97, name: r'userAgent', type: IsarType.string, ) @@ -1017,13 +1007,11 @@ void _settingsSerialize( object.sortLibraryNovel, ); writer.writeLong(offsets[92], object.startDatebackup); - writer.writeBool(offsets[93], object.syncAfterReading); - writer.writeBool(offsets[94], object.syncOnAppLaunch); - writer.writeBool(offsets[95], object.themeIsDark); - writer.writeBool(offsets[96], object.updateProgressAfterReading); - writer.writeBool(offsets[97], object.useLibass); - writer.writeBool(offsets[98], object.usePageTapZones); - writer.writeString(offsets[99], object.userAgent); + writer.writeBool(offsets[93], object.themeIsDark); + writer.writeBool(offsets[94], object.updateProgressAfterReading); + writer.writeBool(offsets[95], object.useLibass); + writer.writeBool(offsets[96], object.usePageTapZones); + writer.writeString(offsets[97], object.userAgent); } Settings _settingsDeserialize( @@ -1200,13 +1188,11 @@ Settings _settingsDeserialize( allOffsets, ), startDatebackup: reader.readLongOrNull(offsets[92]), - syncAfterReading: reader.readBoolOrNull(offsets[93]), - syncOnAppLaunch: reader.readBoolOrNull(offsets[94]), - themeIsDark: reader.readBoolOrNull(offsets[95]), - updateProgressAfterReading: reader.readBoolOrNull(offsets[96]), - useLibass: reader.readBoolOrNull(offsets[97]), - usePageTapZones: reader.readBoolOrNull(offsets[98]), - userAgent: reader.readStringOrNull(offsets[99]), + themeIsDark: reader.readBoolOrNull(offsets[93]), + updateProgressAfterReading: reader.readBoolOrNull(offsets[94]), + useLibass: reader.readBoolOrNull(offsets[95]), + usePageTapZones: reader.readBoolOrNull(offsets[96]), + userAgent: reader.readStringOrNull(offsets[97]), ); object.chapterFilterBookmarkedList = reader.readObjectList( @@ -1533,10 +1519,6 @@ P _settingsDeserializeProp

( case 96: return (reader.readBoolOrNull(offset)) as P; case 97: - return (reader.readBoolOrNull(offset)) as P; - case 98: - return (reader.readBoolOrNull(offset)) as P; - case 99: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -7545,62 +7527,6 @@ extension SettingsQueryFilter }); } - QueryBuilder - syncAfterReadingIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'syncAfterReading', - )); - }); - } - - QueryBuilder - syncAfterReadingIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'syncAfterReading', - )); - }); - } - - QueryBuilder - syncAfterReadingEqualTo(bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'syncAfterReading', - value: value, - )); - }); - } - - QueryBuilder - syncOnAppLaunchIsNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'syncOnAppLaunch', - )); - }); - } - - QueryBuilder - syncOnAppLaunchIsNotNull() { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'syncOnAppLaunch', - )); - }); - } - - QueryBuilder - syncOnAppLaunchEqualTo(bool? value) { - return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'syncOnAppLaunch', - value: value, - )); - }); - } - QueryBuilder themeIsDarkIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -9032,30 +8958,6 @@ extension SettingsQuerySortBy on QueryBuilder { }); } - QueryBuilder sortBySyncAfterReading() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncAfterReading', Sort.asc); - }); - } - - QueryBuilder sortBySyncAfterReadingDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncAfterReading', Sort.desc); - }); - } - - QueryBuilder sortBySyncOnAppLaunch() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncOnAppLaunch', Sort.asc); - }); - } - - QueryBuilder sortBySyncOnAppLaunchDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncOnAppLaunch', Sort.desc); - }); - } - QueryBuilder sortByThemeIsDark() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'themeIsDark', Sort.asc); @@ -10122,30 +10024,6 @@ extension SettingsQuerySortThenBy }); } - QueryBuilder thenBySyncAfterReading() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncAfterReading', Sort.asc); - }); - } - - QueryBuilder thenBySyncAfterReadingDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncAfterReading', Sort.desc); - }); - } - - QueryBuilder thenBySyncOnAppLaunch() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncOnAppLaunch', Sort.asc); - }); - } - - QueryBuilder thenBySyncOnAppLaunchDesc() { - return QueryBuilder.apply(this, (query) { - return query.addSortBy(r'syncOnAppLaunch', Sort.desc); - }); - } - QueryBuilder thenByThemeIsDark() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'themeIsDark', Sort.asc); @@ -10715,18 +10593,6 @@ extension SettingsQueryWhereDistinct }); } - QueryBuilder distinctBySyncAfterReading() { - return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'syncAfterReading'); - }); - } - - QueryBuilder distinctBySyncOnAppLaunch() { - return QueryBuilder.apply(this, (query) { - return query.addDistinctBy(r'syncOnAppLaunch'); - }); - } - QueryBuilder distinctByThemeIsDark() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'themeIsDark'); @@ -11393,18 +11259,6 @@ extension SettingsQueryProperty }); } - QueryBuilder syncAfterReadingProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'syncAfterReading'); - }); - } - - QueryBuilder syncOnAppLaunchProperty() { - return QueryBuilder.apply(this, (query) { - return query.addPropertyName(r'syncOnAppLaunch'); - }); - } - QueryBuilder themeIsDarkProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'themeIsDark'); diff --git a/lib/modules/anime/anime_player_view.dart b/lib/modules/anime/anime_player_view.dart index 7eb8199..ca5cb15 100644 --- a/lib/modules/anime/anime_player_view.dart +++ b/lib/modules/anime/anime_player_view.dart @@ -324,7 +324,6 @@ class _AnimeStreamPageState extends riv.ConsumerState _currentPosition.value, _currentTotalDuration.value, save: save); _streamController.setAnimeHistoryUpdate(); - _streamController.checkAndSyncProgress(); } void _setLandscapeMode(bool state) { diff --git a/lib/modules/anime/providers/anime_player_controller_provider.dart b/lib/modules/anime/providers/anime_player_controller_provider.dart index fffa52d..7b2f7cb 100644 --- a/lib/modules/anime/providers/anime_player_controller_provider.dart +++ b/lib/modules/anime/providers/anime_player_controller_provider.dart @@ -7,9 +7,7 @@ import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/services/aniskip.dart'; -import 'package:mangayomi/services/sync_server.dart'; import 'package:mangayomi/utils/chapter_recognition.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'anime_player_controller_provider.g.dart'; @@ -151,13 +149,6 @@ class AnimeStreamController extends _$AnimeStreamController { }); } - void checkAndSyncProgress() { - final syncAfterReading = ref.watch(syncAfterReadingStateProvider); - if (syncAfterReading) { - ref.read(syncServerProvider(syncId: 1).notifier).checkForSync(true); - } - } - void setCurrentPosition(Duration duration, Duration? totalDuration, {bool save = false}) { if (episode.isRead!) return; @@ -174,9 +165,6 @@ class AnimeStreamController extends _$AnimeStreamController { isar.writeTxnSync(() { ep.isRead = isWatch; ep.lastPageRead = (duration.inMilliseconds).toString(); - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(ep, false, false); isar.chapters.putSync(ep); }); if (isWatch) { diff --git a/lib/modules/anime/providers/anime_player_controller_provider.g.dart b/lib/modules/anime/providers/anime_player_controller_provider.g.dart index 6b4783b..b5baf06 100644 --- a/lib/modules/anime/providers/anime_player_controller_provider.g.dart +++ b/lib/modules/anime/providers/anime_player_controller_provider.g.dart @@ -7,7 +7,7 @@ part of 'anime_player_controller_provider.dart'; // ************************************************************************** String _$animeStreamControllerHash() => - r'd3ec7fe7ac2af84393b128e430fd2f5b9224ed14'; + r'57ebd35f033d51fd213763173c26cd887f5c42d7'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/history/history_screen.dart b/lib/modules/history/history_screen.dart index db9b326..4723f15 100644 --- a/lib/modules/history/history_screen.dart +++ b/lib/modules/history/history_screen.dart @@ -10,7 +10,6 @@ import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/history/providers/isar_providers.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/cached_network.dart'; import 'package:mangayomi/utils/constant.dart'; @@ -380,29 +379,12 @@ class _HistoryTabState extends ConsumerState { .id!); for (var chapter in chapters) { - await ref - .read(changedItemsManagerProvider( - managerId: - 1) - .notifier) - .addUpdatedChapterAsync( - chapter, - true, - false); await isar .chapters .delete( chapter .id!); } - await ref - .read(changedItemsManagerProvider( - managerId: - 1) - .notifier) - .addDeletedMangaAsync( - manga, - false); await isar.mangas .delete(manga .id!); diff --git a/lib/modules/library/library_screen.dart b/lib/modules/library/library_screen.dart index 88b7111..6970661 100644 --- a/lib/modules/library/library_screen.dart +++ b/lib/modules/library/library_screen.dart @@ -21,7 +21,6 @@ import 'package:mangayomi/modules/library/providers/add_torrent.dart'; import 'package:mangayomi/modules/library/providers/local_archive.dart'; import 'package:mangayomi/modules/manga/detail/providers/update_manga_detail_providers.dart'; import 'package:mangayomi/modules/more/categories/providers/isar_providers.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/modules/widgets/custom_draggable_tabbar.dart'; import 'package:mangayomi/modules/widgets/manga_image_card_widget.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; @@ -1163,12 +1162,6 @@ class _LibraryScreenState extends ConsumerState } for (var chapter in manga.chapters) { - ref - .read(changedItemsManagerProvider( - managerId: 1) - .notifier) - .addUpdatedChapter( - chapter, true, false); isar.updates .filter() .mangaIdEqualTo(chapter.mangaId) @@ -1176,11 +1169,6 @@ class _LibraryScreenState extends ConsumerState .deleteAllSync(); isar.chapters.deleteSync(chapter.id!); } - ref - .read(changedItemsManagerProvider( - managerId: 1) - .notifier) - .addDeletedManga(manga, false); isar.mangas.deleteSync(manga.id!); } else { manga.favorite = false; diff --git a/lib/modules/library/providers/library_state_provider.dart b/lib/modules/library/providers/library_state_provider.dart index 93d2e77..3965762 100644 --- a/lib/modules/library/providers/library_state_provider.dart +++ b/lib/modules/library/providers/library_state_provider.dart @@ -4,7 +4,6 @@ import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'library_state_provider.g.dart'; @@ -786,9 +785,6 @@ class MangasSetIsReadState extends _$MangasSetIsReadState { for (var chapter in chapters) { chapter.isRead = true; chapter.lastPageRead = "1"; - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chapter, false, false); isar.chapters.putSync(chapter..manga.value = manga); chapter.manga.saveSync(); } @@ -813,9 +809,6 @@ class MangasSetUnReadState extends _$MangasSetUnReadState { isar.writeTxnSync(() { for (var chapter in chapters) { chapter.isRead = false; - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chapter, false, false); isar.chapters.putSync(chapter..manga.value = manga); chapter.manga.saveSync(); } diff --git a/lib/modules/library/providers/library_state_provider.g.dart b/lib/modules/library/providers/library_state_provider.g.dart index cc1c77a..44ade02 100644 --- a/lib/modules/library/providers/library_state_provider.g.dart +++ b/lib/modules/library/providers/library_state_provider.g.dart @@ -2551,7 +2551,7 @@ final isLongPressedMangaStateProvider = typedef _$IsLongPressedMangaState = AutoDisposeNotifier; String _$mangasSetIsReadStateHash() => - r'cb88914fe1c47c1e3a29d43c23a6652b0e8f2ac1'; + r'8f86296f588a48747de625e0471048978ee9bdeb'; abstract class _$MangasSetIsReadState extends BuildlessAutoDisposeNotifier { @@ -2698,7 +2698,7 @@ class _MangasSetIsReadStateProviderElement } String _$mangasSetUnReadStateHash() => - r'7b2f4c579f9cb392830ed4d70aff9ccc3e7952a0'; + r'3413e731b2fd8476a4032d3e47b943ca12f25090'; abstract class _$MangasSetUnReadState extends BuildlessAutoDisposeNotifier { diff --git a/lib/modules/manga/detail/manga_detail_view.dart b/lib/modules/manga/detail/manga_detail_view.dart index d13c7c5..11652e9 100644 --- a/lib/modules/manga/detail/manga_detail_view.dart +++ b/lib/modules/manga/detail/manga_detail_view.dart @@ -22,7 +22,6 @@ import 'package:mangayomi/modules/manga/detail/widgets/tracker_search_widget.dar import 'package:mangayomi/modules/manga/detail/widgets/tracker_widget.dart'; import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; import 'package:mangayomi/modules/more/settings/appearance/providers/pure_black_dark_mode_state_provider.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/modules/more/settings/track/widgets/track_listile.dart'; import 'package:mangayomi/modules/widgets/custom_draggable_tabbar.dart'; import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart'; @@ -733,11 +732,6 @@ class _MangaDetailViewState extends ConsumerState isar.writeTxnSync(() { for (var chapter in chapters) { chapter.isBookmarked = !chapter.isBookmarked!; - ref - .read(changedItemsManagerProvider( - managerId: 1) - .notifier) - .addUpdatedChapter(chapter, false, false); isar.chapters.putSync( chapter..manga.value = widget.manga); chapter.manga.saveSync(); @@ -778,11 +772,6 @@ class _MangaDetailViewState extends ConsumerState if (!chapter.isRead!) { chapter.lastPageRead = "1"; } - ref - .read(changedItemsManagerProvider( - managerId: 1) - .notifier) - .addUpdatedChapter(chapter, false, false); isar.chapters.putSync( chapter..manga.value = widget.manga); chapter.manga.saveSync(); @@ -828,12 +817,6 @@ class _MangaDetailViewState extends ConsumerState if (!chapters[i].isRead!) { chapters[i].isRead = true; chapters[i].lastPageRead = "1"; - ref - .read(changedItemsManagerProvider( - managerId: 1) - .notifier) - .addUpdatedChapter( - chapters[i], false, false); isar.chapters.putSync(chapters[i] ..manga.value = widget.manga); chapters[i].manga.saveSync(); diff --git a/lib/modules/manga/detail/providers/state_providers.dart b/lib/modules/manga/detail/providers/state_providers.dart index 017ccb7..7f07165 100644 --- a/lib/modules/manga/detail/providers/state_providers.dart +++ b/lib/modules/manga/detail/providers/state_providers.dart @@ -5,7 +5,6 @@ import 'package:mangayomi/models/download.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/modules/manga/download/providers/download_provider.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'state_providers.g.dart'; @@ -310,9 +309,6 @@ class ChapterSetIsBookmarkState extends _$ChapterSetIsBookmarkState { isar.writeTxnSync(() { for (var chapter in chapters) { chapter.isBookmarked = !chapter.isBookmarked!; - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chapter, false, false); isar.chapters.putSync(chapter..manga.value = manga); chapter.manga.saveSync(); } @@ -332,9 +328,6 @@ class ChapterSetIsReadState extends _$ChapterSetIsReadState { isar.writeTxnSync(() { for (var chapter in chapters) { chapter.isRead = !chapter.isRead!; - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chapter, false, false); isar.chapters.putSync(chapter..manga.value = manga); chapter.manga.saveSync(); } diff --git a/lib/modules/manga/detail/providers/state_providers.g.dart b/lib/modules/manga/detail/providers/state_providers.g.dart index 86e3dbd..289dce7 100644 --- a/lib/modules/manga/detail/providers/state_providers.g.dart +++ b/lib/modules/manga/detail/providers/state_providers.g.dart @@ -816,7 +816,7 @@ class _ChapterFilterResultStateProviderElement } String _$chapterSetIsBookmarkStateHash() => - r'48d4f203ba51616e9d1142e0dd482d3ae065a4f4'; + r'113131bb13e50566390ee3e34aa2f08820a8870c'; abstract class _$ChapterSetIsBookmarkState extends BuildlessAutoDisposeNotifier { @@ -963,7 +963,7 @@ class _ChapterSetIsBookmarkStateProviderElement } String _$chapterSetIsReadStateHash() => - r'1e219dd68898fc30b6cb64d294377776516775d4'; + r'c319f81ec30565ad81a28cb0a8ce7fddcb47cd77'; abstract class _$ChapterSetIsReadState extends BuildlessAutoDisposeNotifier { diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart index fe82482..cb08fe0 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart @@ -4,7 +4,6 @@ import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/manga.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/services/get_detail.dart'; import 'package:mangayomi/utils/utils.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; @@ -80,9 +79,6 @@ Future updateMangaDetail(Ref ref, } if (chapters.isNotEmpty) { for (var chap in chapters.reversed.toList()) { - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chap, false, false); isar.chapters.putSync(chap); chap.manga.saveSync(); if (manga.chapters.isNotEmpty) { @@ -108,9 +104,6 @@ Future updateMangaDetail(Ref ref, newChap.name == oldChap.name) { oldChap.url = newChap.url; oldChap.scanlator = newChap.scanlator; - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(oldChap, false, false); isar.chapters.putSync(oldChap); oldChap.manga.saveSync(); } diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index a51d9b2..a1b3dfa 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'a058dcca7f99974e89fce2aa7f048edf1a0f7854'; +String _$updateMangaDetailHash() => r'57330e79e3d1afcd9db5e8e0587bbc23d1e02379'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/reader/providers/reader_controller_provider.dart b/lib/modules/manga/reader/providers/reader_controller_provider.dart index ae8d0d3..b1b4fdc 100644 --- a/lib/modules/manga/reader/providers/reader_controller_provider.dart +++ b/lib/modules/manga/reader/providers/reader_controller_provider.dart @@ -11,9 +11,7 @@ import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_preference.dart'; import 'package:mangayomi/modules/manga/detail/providers/track_state_providers.dart'; import 'package:mangayomi/modules/more/providers/incognito_mode_state_provider.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; -import 'package:mangayomi/services/sync_server.dart'; import 'package:mangayomi/utils/chapter_recognition.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'reader_controller_provider.g.dart'; @@ -189,22 +187,12 @@ class ReaderController extends _$ReaderController { }); } - void checkAndSyncProgress() { - final syncAfterReading = ref.watch(syncAfterReadingStateProvider); - if (syncAfterReading) { - ref.read(syncServerProvider(syncId: 1).notifier).checkForSync(true); - } - } - void setChapterBookmarked() { if (incognitoMode) return; final isBookmarked = getChapterBookmarked(); final chap = chapter; isar.writeTxnSync(() { chap.isBookmarked = !isBookmarked; - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chap, false, false); isar.chapters.putSync(chap); }); } @@ -342,9 +330,6 @@ class ReaderController extends _$ReaderController { getIsarSetting()..chapterPageIndexList = chapterPageIndexs); chap.isRead = isRead; chap.lastPageRead = isRead ? '1' : (newIndex + 1).toString(); - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chap, false, false); isar.chapters.putSync(chap); }); if (isRead) { diff --git a/lib/modules/manga/reader/providers/reader_controller_provider.g.dart b/lib/modules/manga/reader/providers/reader_controller_provider.g.dart index 07fcfe6..18900f9 100644 --- a/lib/modules/manga/reader/providers/reader_controller_provider.g.dart +++ b/lib/modules/manga/reader/providers/reader_controller_provider.g.dart @@ -171,7 +171,7 @@ class _CurrentIndexProviderElement Chapter get chapter => (origin as CurrentIndexProvider).chapter; } -String _$readerControllerHash() => r'6576f3506dc5ef309f870de3e5c6e92efe03eefd'; +String _$readerControllerHash() => r'471617bf6fa730d837c8e0d9504bde17cfb635a8'; abstract class _$ReaderController extends BuildlessAutoDisposeNotifier { late final Chapter chapter; diff --git a/lib/modules/manga/reader/reader_view.dart b/lib/modules/manga/reader/reader_view.dart index b7f5e71..b37dcce 100644 --- a/lib/modules/manga/reader/reader_view.dart +++ b/lib/modules/manga/reader/reader_view.dart @@ -143,7 +143,6 @@ class _MangaChapterPageGalleryState @override void dispose() { _readerController.setMangaHistoryUpdate(); - _readerController.checkAndSyncProgress(); _readerController.setPageIndex( _geCurrentIndex(_uChapDataPreload[_currentIndex!].index!), true); _rebuildDetail.close(); diff --git a/lib/modules/manga/reader/widgets/btn_chapter_list_dialog.dart b/lib/modules/manga/reader/widgets/btn_chapter_list_dialog.dart index d1dd431..a9c95a6 100644 --- a/lib/modules/manga/reader/widgets/btn_chapter_list_dialog.dart +++ b/lib/modules/manga/reader/widgets/btn_chapter_list_dialog.dart @@ -4,7 +4,6 @@ import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/modules/manga/reader/providers/push_router.dart'; import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/utils/date.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; @@ -160,8 +159,6 @@ class _ChapterListTileState extends State { isBookmarked = !isBookmarked; }); isar.writeTxnSync(() => { - addUpdatedChapterIndependentProvider.call( - chapter, false, false), isar.chapters.putSync(chapter..isBookmarked = isBookmarked), }); }, diff --git a/lib/modules/more/categories/categories_screen.dart b/lib/modules/more/categories/categories_screen.dart index 01d1e39..2e9785c 100644 --- a/lib/modules/more/categories/categories_screen.dart +++ b/lib/modules/more/categories/categories_screen.dart @@ -5,7 +5,6 @@ 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'; import 'package:mangayomi/modules/widgets/progress_center.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; @@ -183,15 +182,6 @@ class _CategoriesTabState extends ConsumerState { onPressed: () async { await isar.writeTxn( () async { - await ref - .read(changedItemsManagerProvider( - managerId: - 1) - .notifier) - .addDeletedCategoryAsync( - _entries[ - index], - false); await isar .categorys .delete(_entries[ diff --git a/lib/modules/more/settings/sync/providers/sync_providers.dart b/lib/modules/more/settings/sync/providers/sync_providers.dart index 67dc75c..07de85b 100644 --- a/lib/modules/more/settings/sync/providers/sync_providers.dart +++ b/lib/modules/more/settings/sync/providers/sync_providers.dart @@ -1,210 +1,8 @@ -import 'dart:convert'; -import 'dart:developer'; - import 'package:mangayomi/main.dart'; -import 'package:mangayomi/models/category.dart'; -import 'package:mangayomi/models/changed_items.dart'; -import 'package:mangayomi/models/chapter.dart'; -import 'package:mangayomi/models/manga.dart'; -import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/sync_preference.dart'; -import 'package:mangayomi/services/sync_server.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; part 'sync_providers.g.dart'; -@riverpod -void addUpdatedChapterIndependent( - Ref ref, Chapter chapter, bool deleted, bool txn) { - final changedItems = isar.changedItems.getSync(1) ?? ChangedItems(); - bool updated = false; - changedItems.updatedChapters = changedItems.updatedChapters?.map((e) { - if (e.chapterId == chapter.id) { - e.isBookmarked = chapter.isBookmarked; - e.isRead = chapter.isRead; - e.lastPageRead = chapter.lastPageRead; - e.deleted = deleted; - updated = true; - } - return e; - }).toList(); - if (!updated) { - final updatedChapter = UpdatedChapter( - chapterId: chapter.id, - isBookmarked: chapter.isBookmarked, - isRead: chapter.isRead, - lastPageRead: chapter.lastPageRead, - deleted: deleted); - changedItems.updatedChapters = changedItems.updatedChapters?.toList() - ?..add(updatedChapter); - } - if (!txn) { - isar.changedItems.putSync(changedItems); - } else { - isar.writeTxnSync(() { - isar.changedItems.putSync(changedItems); - }); - } -} - -@riverpod -void checkForSyncIndependent(Ref ref, bool silent) { - ref.read(SyncServerProvider(syncId: 1).notifier).checkForSync(silent); -} - -@riverpod -class ChangedItemsManager extends _$ChangedItemsManager { - @override - ChangedItems? build({required int? managerId}) { - return isar.changedItems.getSync(managerId!); - } - - void cleanChangedItems(bool txn) { - final changedItems = - isar.changedItems.getSync(managerId!) ?? ChangedItems(id: managerId); - changedItems.deletedMangas = []; - changedItems.updatedChapters = []; - changedItems.deletedCategories = []; - if (!txn) { - isar.changedItems.putSync(changedItems); - } else { - isar.writeTxnSync(() { - isar.changedItems.putSync(changedItems); - }); - } - } - - void addDeletedManga(Manga manga, bool txn) { - final changedItems = - isar.changedItems.getSync(managerId!) ?? ChangedItems(id: managerId); - log("DEBUG"); - log(jsonEncode(changedItems)); - final deletedManga = DeletedManga(mangaId: manga.id); - changedItems.deletedMangas = changedItems.deletedMangas?.toList() - ?..add(deletedManga); - if (!txn) { - isar.changedItems.putSync(changedItems); - } else { - isar.writeTxnSync(() { - isar.changedItems.putSync(changedItems); - }); - } - } - - Future addDeletedMangaAsync(Manga manga, bool txn) async { - final changedItems = - await isar.changedItems.get(managerId!) ?? ChangedItems(id: managerId); - final deletedManga = DeletedManga(mangaId: manga.id); - changedItems.deletedMangas = changedItems.deletedMangas?.toList() - ?..add(deletedManga); - if (!txn) { - await isar.changedItems.put(changedItems); - } else { - await isar.writeTxn(() async { - await isar.changedItems.put(changedItems); - }); - } - } - - void addUpdatedChapter(Chapter chapter, bool deleted, bool txn) { - final changedItems = - isar.changedItems.getSync(managerId!) ?? ChangedItems(id: managerId); - bool updated = false; - changedItems.updatedChapters = changedItems.updatedChapters?.map((e) { - if (e.chapterId == chapter.id && e.mangaId == chapter.mangaId) { - e.isBookmarked = chapter.isBookmarked; - e.isRead = chapter.isRead; - e.lastPageRead = chapter.lastPageRead; - e.deleted = deleted; - updated = true; - } - return e; - }).toList(); - if (!updated) { - final updatedChapter = UpdatedChapter( - chapterId: chapter.id, - mangaId: chapter.mangaId, - isBookmarked: chapter.isBookmarked, - isRead: chapter.isRead, - lastPageRead: chapter.lastPageRead, - deleted: deleted); - changedItems.updatedChapters = changedItems.updatedChapters?.toList() - ?..add(updatedChapter); - } - if (!txn) { - isar.changedItems.putSync(changedItems); - } else { - isar.writeTxnSync(() { - isar.changedItems.putSync(changedItems); - }); - } - } - - Future addUpdatedChapterAsync(Chapter chapter, bool deleted, bool txn) async { - final changedItems = - await isar.changedItems.get(managerId!) ?? ChangedItems(id: managerId); - bool updated = false; - changedItems.updatedChapters = changedItems.updatedChapters?.map((e) { - if (e.chapterId == chapter.id && e.mangaId == chapter.mangaId) { - e.isBookmarked = chapter.isBookmarked; - e.isRead = chapter.isRead; - e.lastPageRead = chapter.lastPageRead; - e.deleted = deleted; - updated = true; - } - return e; - }).toList(); - if (!updated) { - final updatedChapter = UpdatedChapter( - chapterId: chapter.id, - mangaId: chapter.mangaId, - isBookmarked: chapter.isBookmarked, - isRead: chapter.isRead, - lastPageRead: chapter.lastPageRead, - deleted: deleted); - changedItems.updatedChapters = changedItems.updatedChapters?.toList() - ?..add(updatedChapter); - } - if (!txn) { - await isar.changedItems.put(changedItems); - } else { - await isar.writeTxn(() async { - await isar.changedItems.put(changedItems); - }); - } - } - - void addDeletedCategory(Category category, bool txn) { - final changedItems = - isar.changedItems.getSync(managerId!) ?? ChangedItems(id: managerId); - final deletedCategory = DeletedCategory(categoryId: category.id); - changedItems.deletedCategories = changedItems.deletedCategories?.toList() - ?..add(deletedCategory); - if (!txn) { - isar.changedItems.putSync(changedItems); - } else { - isar.writeTxnSync(() { - isar.changedItems.putSync(changedItems); - }); - } - } - - Future addDeletedCategoryAsync(Category category, bool txn) async { - final changedItems = - await isar.changedItems.get(managerId!) ?? ChangedItems(id: managerId); - final deletedCategory = DeletedCategory(categoryId: category.id); - changedItems.deletedCategories = changedItems.deletedCategories?.toList() - ?..add(deletedCategory); - if (!txn) { - await isar.changedItems.put(changedItems); - } else { - await isar.writeTxn(() async { - await isar.changedItems.put(changedItems); - }); - } - } -} - @riverpod class Synching extends _$Synching { @override @@ -224,13 +22,6 @@ class Synching extends _$Synching { }); } - void setLastSync(int timestamp) { - isar.writeTxnSync(() { - isar.syncPreferences.putSync( - isar.syncPreferences.getSync(syncId!)!..lastSync = timestamp); - }); - } - void setLastUpload(int timestamp) { isar.writeTxnSync(() { isar.syncPreferences.putSync( @@ -252,33 +43,3 @@ class Synching extends _$Synching { }); } } - -@riverpod -class SyncOnAppLaunchState extends _$SyncOnAppLaunchState { - @override - bool build() { - return isar.settings.getSync(227)!.syncOnAppLaunch ?? false; - } - - void set(bool value) { - final settings = isar.settings.getSync(227); - state = value; - isar.writeTxnSync( - () => isar.settings.putSync(settings!..syncOnAppLaunch = value)); - } -} - -@riverpod -class SyncAfterReadingState extends _$SyncAfterReadingState { - @override - bool build() { - return isar.settings.getSync(227)!.syncAfterReading ?? false; - } - - void set(bool value) { - final settings = isar.settings.getSync(227); - state = value; - isar.writeTxnSync( - () => isar.settings.putSync(settings!..syncAfterReading = value)); - } -} diff --git a/lib/modules/more/settings/sync/providers/sync_providers.g.dart b/lib/modules/more/settings/sync/providers/sync_providers.g.dart index d654f2c..910c3bc 100644 --- a/lib/modules/more/settings/sync/providers/sync_providers.g.dart +++ b/lib/modules/more/settings/sync/providers/sync_providers.g.dart @@ -6,8 +6,7 @@ part of 'sync_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$addUpdatedChapterIndependentHash() => - r'7abb8f085a229ec0573c730234fa4fc4ff86d794'; +String _$synchingHash() => r'3ab44d9e753f2d4b51fd10af6c98ffac78cbf201'; /// Copied from Dart SDK class _SystemHash { @@ -30,450 +29,6 @@ class _SystemHash { } } -/// See also [addUpdatedChapterIndependent]. -@ProviderFor(addUpdatedChapterIndependent) -const addUpdatedChapterIndependentProvider = - AddUpdatedChapterIndependentFamily(); - -/// See also [addUpdatedChapterIndependent]. -class AddUpdatedChapterIndependentFamily extends Family { - /// See also [addUpdatedChapterIndependent]. - const AddUpdatedChapterIndependentFamily(); - - /// See also [addUpdatedChapterIndependent]. - AddUpdatedChapterIndependentProvider call( - Chapter chapter, - bool deleted, - bool txn, - ) { - return AddUpdatedChapterIndependentProvider( - chapter, - deleted, - txn, - ); - } - - @override - AddUpdatedChapterIndependentProvider getProviderOverride( - covariant AddUpdatedChapterIndependentProvider provider, - ) { - return call( - provider.chapter, - provider.deleted, - provider.txn, - ); - } - - static const Iterable? _dependencies = null; - - @override - Iterable? get dependencies => _dependencies; - - static const Iterable? _allTransitiveDependencies = null; - - @override - Iterable? get allTransitiveDependencies => - _allTransitiveDependencies; - - @override - String? get name => r'addUpdatedChapterIndependentProvider'; -} - -/// See also [addUpdatedChapterIndependent]. -class AddUpdatedChapterIndependentProvider extends AutoDisposeProvider { - /// See also [addUpdatedChapterIndependent]. - AddUpdatedChapterIndependentProvider( - Chapter chapter, - bool deleted, - bool txn, - ) : this._internal( - (ref) => addUpdatedChapterIndependent( - ref as AddUpdatedChapterIndependentRef, - chapter, - deleted, - txn, - ), - from: addUpdatedChapterIndependentProvider, - name: r'addUpdatedChapterIndependentProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$addUpdatedChapterIndependentHash, - dependencies: AddUpdatedChapterIndependentFamily._dependencies, - allTransitiveDependencies: - AddUpdatedChapterIndependentFamily._allTransitiveDependencies, - chapter: chapter, - deleted: deleted, - txn: txn, - ); - - AddUpdatedChapterIndependentProvider._internal( - super._createNotifier, { - required super.name, - required super.dependencies, - required super.allTransitiveDependencies, - required super.debugGetCreateSourceHash, - required super.from, - required this.chapter, - required this.deleted, - required this.txn, - }) : super.internal(); - - final Chapter chapter; - final bool deleted; - final bool txn; - - @override - Override overrideWith( - void Function(AddUpdatedChapterIndependentRef provider) create, - ) { - return ProviderOverride( - origin: this, - override: AddUpdatedChapterIndependentProvider._internal( - (ref) => create(ref as AddUpdatedChapterIndependentRef), - from: from, - name: null, - dependencies: null, - allTransitiveDependencies: null, - debugGetCreateSourceHash: null, - chapter: chapter, - deleted: deleted, - txn: txn, - ), - ); - } - - @override - AutoDisposeProviderElement createElement() { - return _AddUpdatedChapterIndependentProviderElement(this); - } - - @override - bool operator ==(Object other) { - return other is AddUpdatedChapterIndependentProvider && - other.chapter == chapter && - other.deleted == deleted && - other.txn == txn; - } - - @override - int get hashCode { - var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, chapter.hashCode); - hash = _SystemHash.combine(hash, deleted.hashCode); - hash = _SystemHash.combine(hash, txn.hashCode); - - return _SystemHash.finish(hash); - } -} - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -mixin AddUpdatedChapterIndependentRef on AutoDisposeProviderRef { - /// The parameter `chapter` of this provider. - Chapter get chapter; - - /// The parameter `deleted` of this provider. - bool get deleted; - - /// The parameter `txn` of this provider. - bool get txn; -} - -class _AddUpdatedChapterIndependentProviderElement - extends AutoDisposeProviderElement - with AddUpdatedChapterIndependentRef { - _AddUpdatedChapterIndependentProviderElement(super.provider); - - @override - Chapter get chapter => - (origin as AddUpdatedChapterIndependentProvider).chapter; - @override - bool get deleted => (origin as AddUpdatedChapterIndependentProvider).deleted; - @override - bool get txn => (origin as AddUpdatedChapterIndependentProvider).txn; -} - -String _$checkForSyncIndependentHash() => - r'3a3658a67cd6cb210e76126b33592bd1ea67e3f0'; - -/// See also [checkForSyncIndependent]. -@ProviderFor(checkForSyncIndependent) -const checkForSyncIndependentProvider = CheckForSyncIndependentFamily(); - -/// See also [checkForSyncIndependent]. -class CheckForSyncIndependentFamily extends Family { - /// See also [checkForSyncIndependent]. - const CheckForSyncIndependentFamily(); - - /// See also [checkForSyncIndependent]. - CheckForSyncIndependentProvider call( - bool silent, - ) { - return CheckForSyncIndependentProvider( - silent, - ); - } - - @override - CheckForSyncIndependentProvider getProviderOverride( - covariant CheckForSyncIndependentProvider provider, - ) { - return call( - provider.silent, - ); - } - - static const Iterable? _dependencies = null; - - @override - Iterable? get dependencies => _dependencies; - - static const Iterable? _allTransitiveDependencies = null; - - @override - Iterable? get allTransitiveDependencies => - _allTransitiveDependencies; - - @override - String? get name => r'checkForSyncIndependentProvider'; -} - -/// See also [checkForSyncIndependent]. -class CheckForSyncIndependentProvider extends AutoDisposeProvider { - /// See also [checkForSyncIndependent]. - CheckForSyncIndependentProvider( - bool silent, - ) : this._internal( - (ref) => checkForSyncIndependent( - ref as CheckForSyncIndependentRef, - silent, - ), - from: checkForSyncIndependentProvider, - name: r'checkForSyncIndependentProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$checkForSyncIndependentHash, - dependencies: CheckForSyncIndependentFamily._dependencies, - allTransitiveDependencies: - CheckForSyncIndependentFamily._allTransitiveDependencies, - silent: silent, - ); - - CheckForSyncIndependentProvider._internal( - super._createNotifier, { - required super.name, - required super.dependencies, - required super.allTransitiveDependencies, - required super.debugGetCreateSourceHash, - required super.from, - required this.silent, - }) : super.internal(); - - final bool silent; - - @override - Override overrideWith( - void Function(CheckForSyncIndependentRef provider) create, - ) { - return ProviderOverride( - origin: this, - override: CheckForSyncIndependentProvider._internal( - (ref) => create(ref as CheckForSyncIndependentRef), - from: from, - name: null, - dependencies: null, - allTransitiveDependencies: null, - debugGetCreateSourceHash: null, - silent: silent, - ), - ); - } - - @override - AutoDisposeProviderElement createElement() { - return _CheckForSyncIndependentProviderElement(this); - } - - @override - bool operator ==(Object other) { - return other is CheckForSyncIndependentProvider && other.silent == silent; - } - - @override - int get hashCode { - var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, silent.hashCode); - - return _SystemHash.finish(hash); - } -} - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -mixin CheckForSyncIndependentRef on AutoDisposeProviderRef { - /// The parameter `silent` of this provider. - bool get silent; -} - -class _CheckForSyncIndependentProviderElement - extends AutoDisposeProviderElement with CheckForSyncIndependentRef { - _CheckForSyncIndependentProviderElement(super.provider); - - @override - bool get silent => (origin as CheckForSyncIndependentProvider).silent; -} - -String _$changedItemsManagerHash() => - r'a4f0363ab430ddb6c2a23fde6f5671ba8ec252cf'; - -abstract class _$ChangedItemsManager - extends BuildlessAutoDisposeNotifier { - late final int? managerId; - - ChangedItems? build({ - required int? managerId, - }); -} - -/// See also [ChangedItemsManager]. -@ProviderFor(ChangedItemsManager) -const changedItemsManagerProvider = ChangedItemsManagerFamily(); - -/// See also [ChangedItemsManager]. -class ChangedItemsManagerFamily extends Family { - /// See also [ChangedItemsManager]. - const ChangedItemsManagerFamily(); - - /// See also [ChangedItemsManager]. - ChangedItemsManagerProvider call({ - required int? managerId, - }) { - return ChangedItemsManagerProvider( - managerId: managerId, - ); - } - - @override - ChangedItemsManagerProvider getProviderOverride( - covariant ChangedItemsManagerProvider provider, - ) { - return call( - managerId: provider.managerId, - ); - } - - static const Iterable? _dependencies = null; - - @override - Iterable? get dependencies => _dependencies; - - static const Iterable? _allTransitiveDependencies = null; - - @override - Iterable? get allTransitiveDependencies => - _allTransitiveDependencies; - - @override - String? get name => r'changedItemsManagerProvider'; -} - -/// See also [ChangedItemsManager]. -class ChangedItemsManagerProvider extends AutoDisposeNotifierProviderImpl< - ChangedItemsManager, ChangedItems?> { - /// See also [ChangedItemsManager]. - ChangedItemsManagerProvider({ - required int? managerId, - }) : this._internal( - () => ChangedItemsManager()..managerId = managerId, - from: changedItemsManagerProvider, - name: r'changedItemsManagerProvider', - debugGetCreateSourceHash: - const bool.fromEnvironment('dart.vm.product') - ? null - : _$changedItemsManagerHash, - dependencies: ChangedItemsManagerFamily._dependencies, - allTransitiveDependencies: - ChangedItemsManagerFamily._allTransitiveDependencies, - managerId: managerId, - ); - - ChangedItemsManagerProvider._internal( - super._createNotifier, { - required super.name, - required super.dependencies, - required super.allTransitiveDependencies, - required super.debugGetCreateSourceHash, - required super.from, - required this.managerId, - }) : super.internal(); - - final int? managerId; - - @override - ChangedItems? runNotifierBuild( - covariant ChangedItemsManager notifier, - ) { - return notifier.build( - managerId: managerId, - ); - } - - @override - Override overrideWith(ChangedItemsManager Function() create) { - return ProviderOverride( - origin: this, - override: ChangedItemsManagerProvider._internal( - () => create()..managerId = managerId, - from: from, - name: null, - dependencies: null, - allTransitiveDependencies: null, - debugGetCreateSourceHash: null, - managerId: managerId, - ), - ); - } - - @override - AutoDisposeNotifierProviderElement - createElement() { - return _ChangedItemsManagerProviderElement(this); - } - - @override - bool operator ==(Object other) { - return other is ChangedItemsManagerProvider && other.managerId == managerId; - } - - @override - int get hashCode { - var hash = _SystemHash.combine(0, runtimeType.hashCode); - hash = _SystemHash.combine(hash, managerId.hashCode); - - return _SystemHash.finish(hash); - } -} - -@Deprecated('Will be removed in 3.0. Use Ref instead') -// ignore: unused_element -mixin ChangedItemsManagerRef on AutoDisposeNotifierProviderRef { - /// The parameter `managerId` of this provider. - int? get managerId; -} - -class _ChangedItemsManagerProviderElement - extends AutoDisposeNotifierProviderElement with ChangedItemsManagerRef { - _ChangedItemsManagerProviderElement(super.provider); - - @override - int? get managerId => (origin as ChangedItemsManagerProvider).managerId; -} - -String _$synchingHash() => r'2ef7fd99da4292ed236252d2b727cff9a69f43a9'; - abstract class _$Synching extends BuildlessAutoDisposeNotifier { late final int? syncId; @@ -616,40 +171,5 @@ class _SynchingProviderElement @override int? get syncId => (origin as SynchingProvider).syncId; } - -String _$syncOnAppLaunchStateHash() => - r'dc7f3243e38a748462628229066c8fc0653c908b'; - -/// See also [SyncOnAppLaunchState]. -@ProviderFor(SyncOnAppLaunchState) -final syncOnAppLaunchStateProvider = - AutoDisposeNotifierProvider.internal( - SyncOnAppLaunchState.new, - name: r'syncOnAppLaunchStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$syncOnAppLaunchStateHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef _$SyncOnAppLaunchState = AutoDisposeNotifier; -String _$syncAfterReadingStateHash() => - r'e507acd490b5aea7fc1a8fd7a369ec01f4c47192'; - -/// See also [SyncAfterReadingState]. -@ProviderFor(SyncAfterReadingState) -final syncAfterReadingStateProvider = - AutoDisposeNotifierProvider.internal( - SyncAfterReadingState.new, - name: r'syncAfterReadingStateProvider', - debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') - ? null - : _$syncAfterReadingStateHash, - dependencies: null, - allTransitiveDependencies: null, -); - -typedef _$SyncAfterReadingState = AutoDisposeNotifier; // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/lib/modules/more/settings/sync/sync.dart b/lib/modules/more/settings/sync/sync.dart index ad41286..70dfb14 100644 --- a/lib/modules/more/settings/sync/sync.dart +++ b/lib/modules/more/settings/sync/sync.dart @@ -4,7 +4,6 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/utils/date.dart'; import 'package:mangayomi/models/sync_preference.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/modules/more/settings/sync/widgets/sync_listile.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/services/sync_server.dart'; @@ -15,8 +14,6 @@ class SyncScreen extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final syncAfterReading = ref.watch(syncAfterReadingStateProvider); - final syncOnAppLaunch = ref.watch(syncOnAppLaunchStateProvider); final l10n = l10nLocalizations(context)!; return Scaffold( appBar: AppBar( @@ -36,26 +33,6 @@ class SyncScreen extends ConsumerWidget { syncPreference.authToken?.isNotEmpty ?? false; return Column( children: [ - SwitchListTile( - value: syncAfterReading, - title: Text(context.l10n.syncAfterReading), - onChanged: !isLogged - ? null - : (value) { - ref - .read(syncAfterReadingStateProvider.notifier) - .set(value); - }), - SwitchListTile( - value: syncOnAppLaunch, - title: Text(context.l10n.syncOnAppLaunch), - onChanged: !isLogged - ? null - : (value) { - ref - .read(syncOnAppLaunchStateProvider.notifier) - .set(value); - }), Padding( padding: const EdgeInsets.only( left: 15, right: 15, bottom: 10, top: 5), @@ -103,12 +80,6 @@ class SyncScreen extends ConsumerWidget { const SizedBox(width: 10), Column(children: [ const SizedBox(width: 20), - Text( - "${l10n.last_sync}: ${dateFormat((syncPreference.lastSync ?? 0).toString(), ref: ref, context: context)} ${dateFormatHour((syncPreference.lastSync ?? 0).toString(), context)}", - style: TextStyle( - fontSize: 11, - color: context.secondaryColor)), - const SizedBox(width: 20), Text( "${l10n.last_upload}: ${dateFormat((syncPreference.lastUpload ?? 0).toString(), ref: ref, context: context)} ${dateFormatHour((syncPreference.lastUpload ?? 0).toString(), context)}", style: TextStyle( @@ -127,27 +98,6 @@ class SyncScreen extends ConsumerWidget { ), Row( children: [ - const SizedBox(width: 20), - Column( - children: [ - IconButton( - onPressed: !isLogged - ? null - : () { - ref - .read(syncServerProvider(syncId: 1) - .notifier) - .checkForSync(false); - }, - icon: Icon( - Icons.sync, - color: !isLogged - ? context.secondaryColor - : context.primaryColor, - )), - Text(l10n.sync_button_sync), - ], - ), const SizedBox(width: 20), Column( children: [ diff --git a/lib/modules/novel/novel_reader_controller_provider.dart b/lib/modules/novel/novel_reader_controller_provider.dart index 68347ec..0cb110d 100644 --- a/lib/modules/novel/novel_reader_controller_provider.dart +++ b/lib/modules/novel/novel_reader_controller_provider.dart @@ -10,9 +10,7 @@ import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_preference.dart'; import 'package:mangayomi/modules/manga/detail/providers/track_state_providers.dart'; -import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; -import 'package:mangayomi/services/sync_server.dart'; import 'package:mangayomi/utils/chapter_recognition.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'novel_reader_controller_provider.g.dart'; @@ -81,10 +79,16 @@ class NovelReaderController extends _$NovelReaderController { }); } - void checkAndSyncProgress() { - final syncAfterReading = ref.watch(syncAfterReadingStateProvider); - if (syncAfterReading) { - ref.read(syncServerProvider(syncId: 1).notifier).checkForSync(true); + void setChapterOffset(double newOffset, double maxOffset, bool save) { + if (incognitoMode) return; + final isRead = (newOffset / (maxOffset != 0 ? maxOffset : 1)) >= 0.9; + if (isRead || save) { + final ch = chapter; + isar.writeTxnSync(() { + ch.isRead = isRead; + ch.lastPageRead = (maxOffset != 0 ? newOffset / maxOffset : 0).toString(); + isar.chapters.putSync(ch); + }); } } @@ -94,9 +98,6 @@ class NovelReaderController extends _$NovelReaderController { final chap = chapter; isar.writeTxnSync(() { chap.isBookmarked = !isBookmarked; - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .addUpdatedChapter(chap, false, false); isar.chapters.putSync(chap); }); } diff --git a/lib/modules/novel/novel_reader_controller_provider.g.dart b/lib/modules/novel/novel_reader_controller_provider.g.dart index b32e177..9229468 100644 --- a/lib/modules/novel/novel_reader_controller_provider.g.dart +++ b/lib/modules/novel/novel_reader_controller_provider.g.dart @@ -7,7 +7,7 @@ part of 'novel_reader_controller_provider.dart'; // ************************************************************************** String _$novelReaderControllerHash() => - r'74ebbf38d60283d308646b59cfd5cfee07c85535'; + r'9ac937ab7fcc82a99088128f0f12f1aaad7fa1e8'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart index f10febe..cbc768f 100644 --- a/lib/modules/novel/novel_reader_view.dart +++ b/lib/modules/novel/novel_reader_view.dart @@ -64,12 +64,28 @@ class _NovelWebViewState extends ConsumerState with TickerProviderStateMixin { late final NovelReaderController _readerController = ref.read(novelReaderControllerProvider(chapter: chapter).notifier); + final _scrollController = ScrollController( + initialScrollOffset: 0, + keepScrollOffset: true, + ); + bool scrolled = false; + double offset = 0; + double maxOffset = 0; bool isDesktop = Platform.isMacOS || Platform.isLinux || Platform.isWindows; + void onScroll() { + if (_scrollController.hasClients) { + offset = _scrollController.offset; + maxOffset = _scrollController.position.maxScrollExtent; + } + } + @override void dispose() { + _readerController.setChapterOffset(offset, maxOffset, true); _readerController.setMangaHistoryUpdate(); - _readerController.checkAndSyncProgress(); + _scrollController.removeListener(onScroll); + _scrollController.dispose(); _rebuildDetail.close(); clearGestureDetailsCache(); if (isDesktop) { @@ -88,6 +104,9 @@ class _NovelWebViewState extends ConsumerState @override void initState() { super.initState(); + WidgetsBinding.instance.addPostFrameCallback((_) { + _scrollController.addListener(onScroll); + }); } late bool _isBookmarked = _readerController.getChapterBookmarked(); @@ -113,7 +132,6 @@ class _NovelWebViewState extends ConsumerState Widget build(BuildContext context) { final backgroundColor = ref.watch(backgroundColorStateProvider); final fullScreenReader = ref.watch(fullScreenReaderStateProvider); - final l10n = l10nLocalizations(context)!; return KeyboardListener( autofocus: true, focusNode: FocusNode(), @@ -183,39 +201,92 @@ class _NovelWebViewState extends ConsumerState children: [ widget.htmlContent.when( data: (htmlContent) { + Future.delayed(const Duration(milliseconds: 1000), + () { + if (!scrolled && _scrollController.hasClients) { + _scrollController.animateTo( + _scrollController.position.maxScrollExtent * + (double.tryParse(chapter.lastPageRead!) ?? + 0), + duration: Duration(seconds: 2), + curve: Curves.fastOutSlowIn); + scrolled = true; + } + }); return Expanded( - child: SingleChildScrollView( - physics: const BouncingScrollPhysics(), - child: HtmlWidget( - htmlContent, - customStylesBuilder: (element) { - switch (backgroundColor) { - case BackgroundColor.black: - return { - 'background-color': 'black', - }; - default: - return { - 'background-color': '#F0F0F0', - }; - } - }, - onTapUrl: (url) { - print('tapped $url'); - return true; - }, - renderMode: RenderMode.column, - textStyle: TextStyle( - color: backgroundColor == - BackgroundColor.white - ? Colors.black - : Colors.white, - //fontFamily: "Times New Roman", - //fontFamilyFallback: ["Times", "serif"], - fontSize: 14), - ), + child: SingleChildScrollView( + controller: _scrollController, + physics: const BouncingScrollPhysics(), + child: Column( + children: [ + HtmlWidget( + htmlContent, + customStylesBuilder: (element) { + switch (backgroundColor) { + case BackgroundColor.black: + return { + 'background-color': 'black', + }; + default: + return { + 'background-color': '#F0F0F0', + }; + } + }, + onTapUrl: (url) { + context.push("/mangawebview", + extra: {'url': url, 'title': url}); + return true; + }, + renderMode: RenderMode.column, + textStyle: TextStyle( + color: backgroundColor == + BackgroundColor.white + ? Colors.black + : Colors.white, + fontSize: 14), + ), + Center( + child: IconButton( + padding: const EdgeInsets.all(5), + onPressed: () => + pushReplacementMangaReaderView( + context: context, + chapter: + _readerController.getPrevChapter(), + ), + icon: Icon( + Icons.arrow_back, + color: backgroundColor == + BackgroundColor.white + ? Colors.black + : Colors.white, + ), + ), + ), + Center( + child: IconButton( + padding: const EdgeInsets.all(5), + onPressed: () => + pushReplacementMangaReaderView( + context: context, + chapter: + _readerController.getNextChapter(), + ), + icon: Icon( + Icons.arrow_forward, + color: backgroundColor == + BackgroundColor.white + ? Colors.black + : Colors.white, + ), + ), + ), + ], ), - );}, + ), + ); + }, loading: () => const Expanded( child: Center( child: CircularProgressIndicator(), diff --git a/lib/providers/storage_provider.dart b/lib/providers/storage_provider.dart index 039651d..a2977e8 100644 --- a/lib/providers/storage_provider.dart +++ b/lib/providers/storage_provider.dart @@ -4,7 +4,6 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/eval/model/source_preference.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/category.dart'; -import 'package:mangayomi/models/changed_items.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/download.dart'; import 'package:mangayomi/models/update.dart'; @@ -147,7 +146,6 @@ class StorageProvider { final isar = Isar.openSync([ MangaSchema, - ChangedItemsSchema, ChapterSchema, CategorySchema, UpdateSchema, diff --git a/lib/services/get_html_content.dart b/lib/services/get_html_content.dart index f9de323..5501250 100644 --- a/lib/services/get_html_content.dart +++ b/lib/services/get_html_content.dart @@ -23,5 +23,5 @@ Future getHtmlContent(Ref ref, {required Chapter chapter}) async { return '''

${html.substring(1, html.length - 1)}
''' .replaceAll("\\n", "") .replaceAll("\\t", "") - .replaceAll("\\", ""); + .replaceAll("\\\"", "\""); } diff --git a/lib/services/get_html_content.g.dart b/lib/services/get_html_content.g.dart index 8bf4df3..5444182 100644 --- a/lib/services/get_html_content.g.dart +++ b/lib/services/get_html_content.g.dart @@ -6,7 +6,7 @@ part of 'get_html_content.dart'; // RiverpodGenerator // ************************************************************************** -String _$getHtmlContentHash() => r'5369236d1d8058cd42a832d1d641a37777da653b'; +String _$getHtmlContentHash() => r'0c964239912b7f93bfb4c80a47f7266ff1ae3f5e'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/services/sync_server.dart b/lib/services/sync_server.dart index 948b87b..0078c4a 100644 --- a/lib/services/sync_server.dart +++ b/lib/services/sync_server.dart @@ -1,9 +1,7 @@ -import 'package:crypto/crypto.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/eval/model/m_bridge.dart'; import 'package:mangayomi/eval/model/source_preference.dart'; import 'package:mangayomi/main.dart'; -import 'package:mangayomi/models/changed_items.dart'; import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/sync_preference.dart'; import 'package:mangayomi/models/track.dart'; @@ -30,8 +28,6 @@ part 'sync_server.g.dart'; class SyncServer extends _$SyncServer { final http = MClient.init(reqcopyWith: {'useDartHttpClient': true}); final String _loginUrl = '/login'; - final String _checkUrl = '/check'; - final String _syncUrl = '/sync'; final String _uploadUrl = '/upload/full'; final String _downloadUrl = '/download'; @@ -67,78 +63,6 @@ class SyncServer extends _$SyncServer { } } - Future checkForSync(bool silent) async { - if (!silent) { - botToast("Checking for sync...", second: 2); - } - try { - final datas = _getData(); - final accessToken = _getAccessToken(); - final localHash = _getDataHash(datas); - - var response = await http.get( - Uri.parse('${_getServer()}$_checkUrl'), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $accessToken' - }, - ); - if (response.statusCode != 200) { - botToast("Check failed", second: 5); - return; - } - var jsonData = jsonDecode(response.body) as Map; - final remoteHash = jsonData["hash"]; - if (localHash != remoteHash) { - syncToServer(silent); - } else if (!silent) { - botToast("Sync up to date", second: 2); - } - } catch (error) { - botToast(error.toString(), second: 5); - } - } - - Future syncToServer(bool silent) async { - if (!silent) { - botToast("Sync started...", second: 2); - } - try { - final datas = _getData(); - final accessToken = _getAccessToken(); - - var response = await http.post( - Uri.parse('${_getServer()}$_syncUrl'), - headers: { - 'Content-Type': 'application/json', - 'Authorization': 'Bearer $accessToken' - }, - body: jsonEncode( - {'backupData': datas, 'changedItems': _getChangedData()}), - ); - if (response.statusCode != 200) { - botToast("Sync failed", second: 5); - return; - } - var jsonData = jsonDecode(response.body) as Map; - final decodedBackupData = jsonData["backupData"] is String - ? jsonDecode(jsonData["backupData"]) - : jsonData["backupData"]; - _restoreMerge(decodedBackupData); - ref - .read(synchingProvider(syncId: syncId).notifier) - .setLastSync(DateTime.now().millisecondsSinceEpoch); - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .cleanChangedItems(true); - if (!silent) { - botToast("Sync finished", second: 2); - } - } catch (error) { - botToast(error.toString(), second: 5); - } - } - Future uploadToServer(AppLocalizations l10n) async { botToast(l10n.sync_uploading, second: 2); try { @@ -160,9 +84,6 @@ class SyncServer extends _$SyncServer { ref .read(synchingProvider(syncId: syncId).notifier) .setLastUpload(DateTime.now().millisecondsSinceEpoch); - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .cleanChangedItems(true); botToast(l10n.sync_upload_finished, second: 2); } catch (error) { botToast(error.toString(), second: 5); @@ -192,49 +113,12 @@ class SyncServer extends _$SyncServer { ref .read(synchingProvider(syncId: syncId).notifier) .setLastDownload(DateTime.now().millisecondsSinceEpoch); - ref - .read(changedItemsManagerProvider(managerId: 1).notifier) - .cleanChangedItems(true); botToast(l10n.sync_download_finished, second: 2); } catch (error) { botToast(error.toString(), second: 5); } } - String _getDataHash(Map data) { - Map datas = {}; - datas["version"] = data["version"]; - datas["manga"] = data["manga"]; - datas["categories"] = data["categories"]; - datas["chapters"] = data["chapters"]; - datas["tracks"] = data["tracks"]; - datas["history"] = data["history"]; - datas["updates"] = data["updates"]; - var encodedJson = jsonEncode(datas); - return sha256.convert(utf8.encode(encodedJson)).toString(); - } - - Map _getChangedData() { - Map data = {}; - final changedItems = isar.changedItems.getSync(1); - if (changedItems != null) { - data.addAll({ - "deletedMangas": - changedItems.deletedMangas?.map((e) => e.toJson()).toList() ?? [] - }); - data.addAll({ - "updatedChapters": - changedItems.updatedChapters?.map((e) => e.toJson()).toList() ?? [] - }); - data.addAll({ - "deletedCategories": - changedItems.deletedCategories?.map((e) => e.toJson()).toList() ?? - [] - }); - } - return data; - } - Map _getData() { Map datas = {}; datas.addAll({"version": "1"}); @@ -309,93 +193,6 @@ class SyncServer extends _$SyncServer { return datas; } - void _restoreMerge(Map backup) { - if (backup['version'] == "1") { - try { - final manga = - (backup["manga"] as List?)?.map((e) => Manga.fromJson(e)).toList(); - final chapters = (backup["chapters"] as List?) - ?.map((e) => Chapter.fromJson(e)) - .toList(); - final categories = (backup["categories"] as List?) - ?.map((e) => Category.fromJson(e)) - .toList(); - final track = - (backup["tracks"] as List?)?.map((e) => Track.fromJson(e)).toList(); - final history = (backup["history"] as List?) - ?.map((e) => History.fromJson(e)) - .toList(); - final updates = (backup["updates"] as List?) - ?.map((e) => Update.fromJson(e)) - .toList(); - - isar.writeTxnSync(() { - isar.mangas.clearSync(); - if (manga != null) { - isar.mangas.putAllSync(manga); - if (chapters != null) { - isar.chapters.clearSync(); - for (var chapter in chapters) { - final manga = isar.mangas.getSync(chapter.mangaId!); - if (manga != null) { - isar.chapters.putSync(chapter..manga.value = manga); - chapter.manga.saveSync(); - } - } - - isar.historys.clearSync(); - if (history != null) { - for (var element in history) { - final chapter = isar.chapters.getSync(element.chapterId!); - if (chapter != null) { - isar.historys.putSync(element..chapter.value = chapter); - element.chapter.saveSync(); - } - } - } - - isar.updates.clearSync(); - if (updates != null) { - final tempChapters = - isar.chapters.filter().idIsNotNull().findAllSync().toList(); - for (var update in updates) { - final matchingChapter = tempChapters - .where((chapter) => - chapter.mangaId == update.mangaId && - chapter.name == update.chapterName) - .firstOrNull; - if (matchingChapter != null) { - isar.updates - .putSync(update..chapter.value = matchingChapter); - update.chapter.saveSync(); - } - } - } - } - - isar.categorys.clearSync(); - if (categories != null) { - isar.categorys.putAllSync(categories); - } - } - - isar.tracks.clearSync(); - if (track != null) { - isar.tracks.putAllSync(track); - } - - ref.invalidate(themeModeStateProvider); - ref.invalidate(blendLevelStateProvider); - ref.invalidate(flexSchemeColorStateProvider); - ref.invalidate(pureBlackDarkModeStateProvider); - ref.invalidate(l10nLocaleStateProvider); - }); - } catch (e) { - botToast(e.toString()); - } - } - } - void _restore(Map backup) { if (backup['version'] == "1") { try { @@ -489,8 +286,6 @@ class SyncServer extends _$SyncServer { if (extensionsPref != null) { isar.sourcePreferences.putAllSync(extensionsPref); } - final syncAfterReading = isar.settings.getSync(227)!.syncAfterReading; - final syncOnAppLaunch = isar.settings.getSync(227)!.syncOnAppLaunch; isar.settings.clearSync(); if (settings != null) { isar.settings.putAllSync(settings); @@ -498,10 +293,6 @@ class SyncServer extends _$SyncServer { if (isar.settings.getSync(227) == null) { isar.settings.putSync(Settings(id: 227)); } - isar.settings.putSync( - isar.settings.getSync(227)!..syncAfterReading = syncAfterReading); - isar.settings.putSync( - isar.settings.getSync(227)!..syncOnAppLaunch = syncOnAppLaunch); ref.invalidate(themeModeStateProvider); ref.invalidate(blendLevelStateProvider); ref.invalidate(flexSchemeColorStateProvider); diff --git a/lib/services/sync_server.g.dart b/lib/services/sync_server.g.dart index b2a9cd6..7efca60 100644 --- a/lib/services/sync_server.g.dart +++ b/lib/services/sync_server.g.dart @@ -6,7 +6,7 @@ part of 'sync_server.dart'; // RiverpodGenerator // ************************************************************************** -String _$syncServerHash() => r'99e16d503937f2973f00c0cf2e834a03cf4aa245'; +String _$syncServerHash() => r'db0f27093c2e76d4158b7af7960359c54c9a00b2'; /// Copied from Dart SDK class _SystemHash { From 84c82ba1ee8b6e8c74b75868b2adcc79cba43043 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sun, 22 Dec 2024 02:39:31 +0100 Subject: [PATCH 15/18] show novel progress in percentage and fixed gesture detector --- .../update_manga_detail_providers.g.dart | 2 +- .../widgets/chapter_list_tile_widget.dart | 5 +- .../providers/download_provider.g.dart | 2 +- .../widgets/btn_chapter_list_dialog.dart | 2 +- .../novel_reader_controller_provider.dart | 80 +--------- .../novel_reader_controller_provider.g.dart | 2 +- lib/modules/novel/novel_reader_view.dart | 146 ++++++++++-------- lib/services/get_chapter_pages.g.dart | 2 +- 8 files changed, 95 insertions(+), 146 deletions(-) diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart index bf391d7..2ffd011 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.g.dart @@ -6,7 +6,7 @@ part of 'update_manga_detail_providers.dart'; // RiverpodGenerator // ************************************************************************** -String _$updateMangaDetailHash() => r'82c52aa8760fb455e6558be925d05f5f0703af98'; +String _$updateMangaDetailHash() => r'a86fe8fea46e411203182287c970cd80cc9a1a0c'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart b/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart index 4338ec7..2316bcd 100644 --- a/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart +++ b/lib/modules/manga/detail/widgets/chapter_list_tile_widget.dart @@ -97,7 +97,10 @@ class ChapterListTileWidget extends ConsumerWidget { int.parse(chapter.lastPageRead!)) .toString() .substringBefore(".")) - : l10n.page(chapter.lastPageRead!), + : l10n.page(chapter.manga.value!.itemType == + ItemType.manga + ? chapter.lastPageRead! + : "${((double.tryParse(chapter.lastPageRead!) ?? 0) * 100).toStringAsFixed(0)} %"), style: TextStyle( fontSize: 11, color: context.isLight diff --git a/lib/modules/manga/download/providers/download_provider.g.dart b/lib/modules/manga/download/providers/download_provider.g.dart index 9504b9d..4ae49a4 100644 --- a/lib/modules/manga/download/providers/download_provider.g.dart +++ b/lib/modules/manga/download/providers/download_provider.g.dart @@ -6,7 +6,7 @@ part of 'download_provider.dart'; // RiverpodGenerator // ************************************************************************** -String _$downloadChapterHash() => r'44f8aeae592a90e0c657da0263276997afbbe433'; +String _$downloadChapterHash() => r'de8e2d5b952071bc0d014fc3aa5c9b0714fbcee0'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/manga/reader/widgets/btn_chapter_list_dialog.dart b/lib/modules/manga/reader/widgets/btn_chapter_list_dialog.dart index a9c95a6..6d7c50a 100644 --- a/lib/modules/manga/reader/widgets/btn_chapter_list_dialog.dart +++ b/lib/modules/manga/reader/widgets/btn_chapter_list_dialog.dart @@ -137,7 +137,7 @@ class _ChapterListTileState extends State { if (!chapter.isRead!) if (chapter.lastPageRead!.isNotEmpty && chapter.lastPageRead != "1") - if (chapter.scanlator!.isNotEmpty) + if (chapter.scanlator != null && chapter.scanlator!.isNotEmpty) Row( children: [ const Text(' • '), diff --git a/lib/modules/novel/novel_reader_controller_provider.dart b/lib/modules/novel/novel_reader_controller_provider.dart index 0cb110d..621106e 100644 --- a/lib/modules/novel/novel_reader_controller_provider.dart +++ b/lib/modules/novel/novel_reader_controller_provider.dart @@ -1,5 +1,3 @@ -import 'package:flutter/material.dart'; -import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/chapter.dart'; @@ -7,25 +5,9 @@ import 'package:mangayomi/models/download.dart'; import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/settings.dart'; -import 'package:mangayomi/models/track.dart'; -import 'package:mangayomi/models/track_preference.dart'; -import 'package:mangayomi/modules/manga/detail/providers/track_state_providers.dart'; -import 'package:mangayomi/modules/more/settings/track/providers/track_providers.dart'; -import 'package:mangayomi/utils/chapter_recognition.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'novel_reader_controller_provider.g.dart'; -BoxFit getBoxFit(ScaleType scaleType) { - return switch (scaleType) { - ScaleType.fitHeight => BoxFit.fitHeight, - ScaleType.fitWidth => BoxFit.fitWidth, - ScaleType.fitScreen => BoxFit.contain, - ScaleType.originalSize => BoxFit.cover, - ScaleType.smartFit => BoxFit.contain, - _ => BoxFit.cover - }; -} - @riverpod class NovelReaderController extends _$NovelReaderController { @override @@ -115,7 +97,7 @@ class NovelReaderController extends _$NovelReaderController { } } if (index == null) { - final chapters = getManga().chapters.toList().reversed.toList(); + final chapters = getManga().chapters.toList().toList(); for (var i = 0; i < chapters.length; i++) { if (chapters[i].id == chapter.id) { index = i + 1; @@ -135,7 +117,7 @@ class NovelReaderController extends _$NovelReaderController { } } if (index == null) { - final chapters = getManga().chapters.toList().reversed.toList(); + final chapters = getManga().chapters.toList().toList(); for (var i = 0; i < chapters.length; i++) { if (chapters[i].id == chapter.id) { index = i - 1; @@ -155,7 +137,7 @@ class NovelReaderController extends _$NovelReaderController { } } if (index == null) { - final chapters = getManga().chapters.toList().reversed.toList(); + final chapters = getManga().chapters.toList().toList(); for (var i = 0; i < chapters.length; i++) { if (chapters[i].id == chapter.id) { index = i; @@ -170,14 +152,14 @@ class NovelReaderController extends _$NovelReaderController { final prevChapIdx = getPrevChapterIndex(); return prevChapIdx.$2 ? getManga().getFilteredChapterList()[prevChapIdx.$1] - : getManga().chapters.toList().reversed.toList()[prevChapIdx.$1]; + : getManga().chapters.toList().toList()[prevChapIdx.$1]; } Chapter getNextChapter() { final nextChapIdx = getNextChapterIndex(); return nextChapIdx.$2 ? getManga().getFilteredChapterList()[nextChapIdx.$1] - : getManga().chapters.toList().reversed.toList()[nextChapIdx.$1]; + : getManga().chapters.toList().toList()[nextChapIdx.$1]; } int getChaptersLength(bool isInFilterList) { @@ -199,59 +181,9 @@ class NovelReaderController extends _$NovelReaderController { } } -extension ChapterExtensions on Chapter { - void updateTrackChapterRead(dynamic ref) { - if (!(ref is WidgetRef || ref is Ref)) return; - final updateProgressAfterReading = - ref.watch(updateProgressAfterReadingStateProvider); - if (!updateProgressAfterReading) return; - final manga = this.manga.value!; - final chapterNumber = - ChapterRecognition().parseChapterNumber(manga.name!, name!); - - final tracks = isar.tracks - .filter() - .idIsNotNull() - .isMangaEqualTo(manga.itemType == ItemType.manga) - .mangaIdEqualTo(manga.id!) - .findAllSync(); - - if (tracks.isEmpty) return; - for (var track in tracks) { - final service = isar.trackPreferences - .filter() - .syncIdIsNotNull() - .syncIdEqualTo(track.syncId) - .findFirstSync(); - if (!(service == null || chapterNumber <= (track.lastChapterRead ?? 0))) { - if (track.status != TrackStatus.completed) { - track.lastChapterRead = chapterNumber; - if (track.lastChapterRead == track.totalChapter && - (track.totalChapter ?? 0) > 0) { - track.status = TrackStatus.completed; - track.finishedReadingDate = DateTime.now().millisecondsSinceEpoch; - } else { - track.status = manga.itemType == ItemType.manga - ? TrackStatus.reading - : TrackStatus.watching; - if (track.lastChapterRead == 1) { - track.startedReadingDate = DateTime.now().millisecondsSinceEpoch; - } - } - } - ref - .read(trackStateProvider( - track: track, isManga: manga.itemType == ItemType.manga) - .notifier) - .updateManga(); - } - } - } -} - extension MangaExtensions on Manga { List getFilteredChapterList() { - final data = this.chapters.toList().reversed.toList(); + final data = this.chapters.toList().toList(); final filterUnread = (isar.settings .getSync(227)! .chapterFilterUnreadList! diff --git a/lib/modules/novel/novel_reader_controller_provider.g.dart b/lib/modules/novel/novel_reader_controller_provider.g.dart index 9229468..0d0d48b 100644 --- a/lib/modules/novel/novel_reader_controller_provider.g.dart +++ b/lib/modules/novel/novel_reader_controller_provider.g.dart @@ -7,7 +7,7 @@ part of 'novel_reader_controller_provider.dart'; // ************************************************************************** String _$novelReaderControllerHash() => - r'9ac937ab7fcc82a99088128f0f12f1aaad7fa1e8'; + r'2eec885b858de8195e31a2d0b70feb56c1dc4268'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart index cbc768f..79ff04b 100644 --- a/lib/modules/novel/novel_reader_view.dart +++ b/lib/modules/novel/novel_reader_view.dart @@ -217,72 +217,86 @@ class _NovelWebViewState extends ConsumerState child: SingleChildScrollView( controller: _scrollController, physics: const BouncingScrollPhysics(), - child: Column( - children: [ - HtmlWidget( - htmlContent, - customStylesBuilder: (element) { - switch (backgroundColor) { - case BackgroundColor.black: - return { - 'background-color': 'black', - }; - default: - return { - 'background-color': '#F0F0F0', - }; - } - }, - onTapUrl: (url) { - context.push("/mangawebview", - extra: {'url': url, 'title': url}); - return true; - }, - renderMode: RenderMode.column, - textStyle: TextStyle( - color: backgroundColor == - BackgroundColor.white - ? Colors.black - : Colors.white, - fontSize: 14), - ), - Center( - child: IconButton( - padding: const EdgeInsets.all(5), - onPressed: () => - pushReplacementMangaReaderView( - context: context, - chapter: - _readerController.getPrevChapter(), - ), - icon: Icon( - Icons.arrow_back, - color: backgroundColor == - BackgroundColor.white - ? Colors.black - : Colors.white, + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + _isViewFunction(); + }, + child: Column( + children: [ + HtmlWidget( + htmlContent, + customStylesBuilder: (element) { + switch (backgroundColor) { + case BackgroundColor.black: + return { + 'background-color': 'black', + }; + default: + return { + 'background-color': '#F0F0F0', + }; + } + }, + onTapUrl: (url) { + context.push("/mangawebview", + extra: {'url': url, 'title': url}); + return true; + }, + renderMode: RenderMode.column, + textStyle: TextStyle( + color: backgroundColor == + BackgroundColor.white + ? Colors.black + : Colors.white, + fontSize: 14), + ), + Center( + heightFactor: 2, + child: Row( + mainAxisAlignment: + MainAxisAlignment.center, + spacing: 5, + children: [ + IconButton( + padding: const EdgeInsets.all(5), + onPressed: () => + pushReplacementMangaReaderView( + context: context, + chapter: _readerController + .getPrevChapter(), + ), + icon: Icon( + size: 32, + Icons.arrow_back, + color: backgroundColor == + BackgroundColor.white + ? Colors.black + : Colors.white, + ), + ), + IconButton( + padding: const EdgeInsets.all(5), + onPressed: () => + pushReplacementMangaReaderView( + context: context, + chapter: _readerController + .getNextChapter(), + ), + icon: Icon( + size: 32, + Icons.arrow_forward, + color: backgroundColor == + BackgroundColor.white + ? Colors.black + : Colors.white, + ), + ), + ], ), ), - ), - Center( - child: IconButton( - padding: const EdgeInsets.all(5), - onPressed: () => - pushReplacementMangaReaderView( - context: context, - chapter: - _readerController.getNextChapter(), - ), - icon: Icon( - Icons.arrow_forward, - color: backgroundColor == - BackgroundColor.white - ? Colors.black - : Colors.white, - ), - ), - ), - ], + ], + ), ), ), ); @@ -296,8 +310,8 @@ class _NovelWebViewState extends ConsumerState )), ], ), - _gestureRightLeft(), - _gestureTopBottom(), + //_gestureRightLeft(), + //_gestureTopBottom(), _appBar(), ], ), diff --git a/lib/services/get_chapter_pages.g.dart b/lib/services/get_chapter_pages.g.dart index 62e0dda..02af665 100644 --- a/lib/services/get_chapter_pages.g.dart +++ b/lib/services/get_chapter_pages.g.dart @@ -6,7 +6,7 @@ part of 'get_chapter_pages.dart'; // RiverpodGenerator // ************************************************************************** -String _$getChapterPagesHash() => r'8a2606a6640046cb006b24516bf88512f3204aca'; +String _$getChapterPagesHash() => r'5b18b20360abecf1125f27c32b10977dd18f1831'; /// Copied from Dart SDK class _SystemHash { From 478c0ba45c2b26e56f38039ad75cddf82ed38b80 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sun, 22 Dec 2024 20:31:41 +0100 Subject: [PATCH 16/18] option to hide certain UI elements + new backup version --- lib/l10n/app_en.arb | 3 + lib/models/category.dart | 12 + lib/models/category.g.dart | 77 ++- lib/models/history.dart | 15 + lib/models/history.g.dart | 85 ++- lib/models/manga.dart | 36 +- lib/models/manga.g.dart | 127 +++- lib/models/settings.dart | 17 +- lib/models/settings.g.dart | 619 ++++++++++++------ lib/models/source.dart | 32 + lib/modules/history/history_screen.dart | 82 ++- lib/modules/main_view/main_screen.dart | 325 ++++----- .../backup_and_restore.dart | 3 +- .../backup_and_restore/providers/backup.dart | 12 +- .../providers/backup.g.dart | 2 +- .../backup_and_restore/providers/restore.dart | 379 +++++++---- .../providers/restore.g.dart | 260 +++++++- .../more/categories/categories_screen.dart | 50 +- .../more/settings/player/player_screen.dart | 8 + .../providers/reader_state_provider.dart | 45 ++ .../providers/reader_state_provider.g.dart | 48 ++ .../more/settings/reader/reader_screen.dart | 14 + lib/modules/updates/updates_screen.dart | 82 ++- lib/services/sync_server.dart | 111 +--- lib/services/sync_server.g.dart | 2 +- 25 files changed, 1743 insertions(+), 703 deletions(-) diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 3ab7e85..d2998d0 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -215,6 +215,9 @@ "sync_confirm_download": "A full download will completely replace your current data with the remote one!", "dialog_confirm": "Confirm", "description": "Description", + "hide_manga": "Hide some elements related to mangas.", + "hide_anime": "Hide some elements related to animes.", + "hide_novel": "Hide some elements related to (light) novels.", "full_screen_player": "Use Fullscreen", "full_screen_player_info": "Automatically use fullscreen when playing a video.", "episode_progress": "Progress: {n}", diff --git a/lib/models/category.dart b/lib/models/category.dart index 306a135..551bcc6 100644 --- a/lib/models/category.dart +++ b/lib/models/category.dart @@ -7,11 +7,13 @@ part 'category.g.dart'; class Category { Id? id; String? name; + bool? forManga; @enumerated late ItemType forItemType; Category( {this.id = Isar.autoIncrement, required this.name, + this.forManga = true, required this.forItemType}); Category.fromJson(Map json) { @@ -20,6 +22,16 @@ class Category { forItemType = json['forItemType']; } + Category.fromJsonV1(Map json) { + id = json['id']; + name = json['name']; + forItemType = json['forManga'] is bool + ? json['forManga'] == true + ? ItemType.manga + : ItemType.anime + : ItemType.manga; + } + Map toJson() => {'id': id, 'name': name, 'forItemType': forItemType}; } diff --git a/lib/models/category.g.dart b/lib/models/category.g.dart index 8dcbd4e..c95018a 100644 --- a/lib/models/category.g.dart +++ b/lib/models/category.g.dart @@ -23,8 +23,13 @@ const CategorySchema = CollectionSchema( type: IsarType.byte, enumMap: _CategoryforItemTypeEnumValueMap, ), - r'name': PropertySchema( + r'forManga': PropertySchema( id: 1, + name: r'forManga', + type: IsarType.bool, + ), + r'name': PropertySchema( + id: 2, name: r'name', type: IsarType.string, ) @@ -65,7 +70,8 @@ void _categorySerialize( Map> allOffsets, ) { writer.writeByte(offsets[0], object.forItemType.index); - writer.writeString(offsets[1], object.name); + writer.writeBool(offsets[1], object.forManga); + writer.writeString(offsets[2], object.name); } Category _categoryDeserialize( @@ -78,8 +84,9 @@ Category _categoryDeserialize( forItemType: _CategoryforItemTypeValueEnumMap[reader.readByteOrNull(offsets[0])] ?? ItemType.manga, + forManga: reader.readBoolOrNull(offsets[1]), id: id, - name: reader.readStringOrNull(offsets[1]), + name: reader.readStringOrNull(offsets[2]), ); return object; } @@ -95,6 +102,8 @@ P _categoryDeserializeProp

( return (_CategoryforItemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? ItemType.manga) as P; case 1: + return (reader.readBoolOrNull(offset)) as P; + case 2: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -255,6 +264,32 @@ extension CategoryQueryFilter }); } + 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) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'forManga', + value: value, + )); + }); + } + QueryBuilder idIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -489,6 +524,18 @@ extension CategoryQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByForManga() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'forManga', Sort.asc); + }); + } + + QueryBuilder sortByForMangaDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'forManga', Sort.desc); + }); + } + QueryBuilder sortByName() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'name', Sort.asc); @@ -516,6 +563,18 @@ extension CategoryQuerySortThenBy }); } + QueryBuilder thenByForManga() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'forManga', Sort.asc); + }); + } + + QueryBuilder thenByForMangaDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'forManga', Sort.desc); + }); + } + QueryBuilder thenById() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'id', Sort.asc); @@ -549,6 +608,12 @@ extension CategoryQueryWhereDistinct }); } + QueryBuilder distinctByForManga() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'forManga'); + }); + } + QueryBuilder distinctByName( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -571,6 +636,12 @@ extension CategoryQueryProperty }); } + QueryBuilder forMangaProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'forManga'); + }); + } + QueryBuilder nameProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'name'); diff --git a/lib/models/history.dart b/lib/models/history.dart index 7f27807..367b353 100644 --- a/lib/models/history.dart +++ b/lib/models/history.dart @@ -12,6 +12,8 @@ class History { int? chapterId; + bool? isManga; + @enumerated late ItemType itemType; @@ -21,6 +23,7 @@ class History { History({ this.id = Isar.autoIncrement, + this.isManga = true, required this.itemType, required this.chapterId, required this.mangaId, @@ -35,6 +38,18 @@ class History { mangaId = json['mangaId']; } + History.fromJsonV1(Map json) { + chapterId = json['chapterId']; + date = json['date']; + id = json['id']; + itemType = json['isManga'] is bool + ? json['isManga'] == true + ? ItemType.manga + : ItemType.anime + : ItemType.manga; + mangaId = json['mangaId']; + } + Map toJson() => { 'chapterId': chapterId, 'date': date, diff --git a/lib/models/history.g.dart b/lib/models/history.g.dart index 0ac2f83..dabe134 100644 --- a/lib/models/history.g.dart +++ b/lib/models/history.g.dart @@ -27,14 +27,19 @@ const HistorySchema = CollectionSchema( name: r'date', type: IsarType.string, ), - r'itemType': PropertySchema( + r'isManga': PropertySchema( id: 2, + name: r'isManga', + type: IsarType.bool, + ), + r'itemType': PropertySchema( + id: 3, name: r'itemType', type: IsarType.byte, enumMap: _HistoryitemTypeEnumValueMap, ), r'mangaId': PropertySchema( - id: 3, + id: 4, name: r'mangaId', type: IsarType.long, ) @@ -83,8 +88,9 @@ void _historySerialize( ) { writer.writeLong(offsets[0], object.chapterId); writer.writeString(offsets[1], object.date); - writer.writeByte(offsets[2], object.itemType.index); - writer.writeLong(offsets[3], object.mangaId); + writer.writeBool(offsets[2], object.isManga); + writer.writeByte(offsets[3], object.itemType.index); + writer.writeLong(offsets[4], object.mangaId); } History _historyDeserialize( @@ -97,9 +103,10 @@ History _historyDeserialize( chapterId: reader.readLongOrNull(offsets[0]), date: reader.readStringOrNull(offsets[1]), id: id, - itemType: _HistoryitemTypeValueEnumMap[reader.readByteOrNull(offsets[2])] ?? + isManga: reader.readBoolOrNull(offsets[2]), + itemType: _HistoryitemTypeValueEnumMap[reader.readByteOrNull(offsets[3])] ?? ItemType.manga, - mangaId: reader.readLongOrNull(offsets[3]), + mangaId: reader.readLongOrNull(offsets[4]), ); return object; } @@ -116,9 +123,11 @@ P _historyDeserializeProp

( case 1: return (reader.readStringOrNull(offset)) as P; case 2: + return (reader.readBoolOrNull(offset)) as P; + case 3: return (_HistoryitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? ItemType.manga) as P; - case 3: + case 4: return (reader.readLongOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -509,6 +518,32 @@ extension HistoryQueryFilter }); } + QueryBuilder isMangaIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'isManga', + )); + }); + } + + QueryBuilder isMangaIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'isManga', + )); + }); + } + + QueryBuilder isMangaEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isManga', + value: value, + )); + }); + } + QueryBuilder itemTypeEqualTo( ItemType value) { return QueryBuilder.apply(this, (query) { @@ -676,6 +711,18 @@ extension HistoryQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByIsManga() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isManga', Sort.asc); + }); + } + + QueryBuilder sortByIsMangaDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isManga', Sort.desc); + }); + } + QueryBuilder sortByItemType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'itemType', Sort.asc); @@ -739,6 +786,18 @@ extension HistoryQuerySortThenBy }); } + QueryBuilder thenByIsManga() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isManga', Sort.asc); + }); + } + + QueryBuilder thenByIsMangaDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isManga', Sort.desc); + }); + } + QueryBuilder thenByItemType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'itemType', Sort.asc); @@ -779,6 +838,12 @@ extension HistoryQueryWhereDistinct }); } + QueryBuilder distinctByIsManga() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isManga'); + }); + } + QueryBuilder distinctByItemType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'itemType'); @@ -812,6 +877,12 @@ extension HistoryQueryProperty }); } + QueryBuilder isMangaProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isManga'); + }); + } + QueryBuilder itemTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'itemType'); diff --git a/lib/models/manga.dart b/lib/models/manga.dart index 1298106..da21256 100644 --- a/lib/models/manga.dart +++ b/lib/models/manga.dart @@ -22,6 +22,8 @@ class Manga { @enumerated late Status status; + bool? isManga; + @enumerated late ItemType itemType; @@ -63,6 +65,7 @@ class Manga { required this.name, required this.status, required this.description, + this.isManga = true, this.itemType = ItemType.manga, this.dateAdded, this.lastUpdate, @@ -95,6 +98,33 @@ class Manga { customCoverFromTracker = json['customCoverFromTracker']; } + Manga.fromJsonV1(Map json) { + author = json['author']; + artist = json['artist']; + categories = json['categories']?.cast(); + customCoverImage = json['customCoverImage']?.cast(); + dateAdded = json['dateAdded']; + description = json['description']; + favorite = json['favorite']!; + genre = json['genre']?.cast(); + id = json['id']; + imageUrl = json['imageUrl']; + isLocalArchive = json['isLocalArchive']; + itemType = json['isManga'] is bool + ? json['isManga'] == true + ? ItemType.manga + : ItemType.anime + : ItemType.manga; + lang = json['lang']; + lastRead = json['lastRead']; + lastUpdate = json['lastUpdate']; + link = json['link']; + name = json['name']; + source = json['source']; + status = Status.values[json['status']]; + customCoverFromTracker = json['customCoverFromTracker']; + } + Map toJson() => { 'author': author, 'artist': artist, @@ -128,8 +158,4 @@ enum Status { publishingFinished } -enum ItemType { - manga, - anime, - novel -} +enum ItemType { manga, anime, novel } diff --git a/lib/models/manga.g.dart b/lib/models/manga.g.dart index e15473b..19d099d 100644 --- a/lib/models/manga.g.dart +++ b/lib/models/manga.g.dart @@ -72,44 +72,49 @@ const MangaSchema = CollectionSchema( name: r'isLocalArchive', type: IsarType.bool, ), - r'itemType': PropertySchema( + r'isManga': PropertySchema( id: 11, + name: r'isManga', + type: IsarType.bool, + ), + r'itemType': PropertySchema( + id: 12, name: r'itemType', type: IsarType.byte, enumMap: _MangaitemTypeEnumValueMap, ), r'lang': PropertySchema( - id: 12, + 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,14 +246,15 @@ void _mangaSerialize( writer.writeStringList(offsets[8], object.genre); writer.writeString(offsets[9], object.imageUrl); writer.writeBool(offsets[10], object.isLocalArchive); - writer.writeByte(offsets[11], object.itemType.index); - writer.writeString(offsets[12], object.lang); - writer.writeLong(offsets[13], object.lastRead); - writer.writeLong(offsets[14], object.lastUpdate); - writer.writeString(offsets[15], object.link); - writer.writeString(offsets[16], object.name); - writer.writeString(offsets[17], object.source); - writer.writeByte(offsets[18], object.status.index); + writer.writeBool(offsets[11], object.isManga); + writer.writeByte(offsets[12], object.itemType.index); + writer.writeString(offsets[13], object.lang); + writer.writeLong(offsets[14], object.lastRead); + writer.writeLong(offsets[15], object.lastUpdate); + writer.writeString(offsets[16], object.link); + writer.writeString(offsets[17], object.name); + writer.writeString(offsets[18], object.source); + writer.writeByte(offsets[19], object.status.index); } Manga _mangaDeserialize( @@ -270,15 +276,16 @@ Manga _mangaDeserialize( id: id, imageUrl: reader.readStringOrNull(offsets[9]), isLocalArchive: reader.readBoolOrNull(offsets[10]), - itemType: _MangaitemTypeValueEnumMap[reader.readByteOrNull(offsets[11])] ?? + isManga: reader.readBoolOrNull(offsets[11]), + itemType: _MangaitemTypeValueEnumMap[reader.readByteOrNull(offsets[12])] ?? ItemType.manga, - 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])] ?? + 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,21 +321,23 @@ P _mangaDeserializeProp

( case 10: return (reader.readBoolOrNull(offset)) as P; case 11: + return (reader.readBoolOrNull(offset)) as P; + case 12: return (_MangaitemTypeValueEnumMap[reader.readByteOrNull(offset)] ?? ItemType.manga) as P; - case 12: - return (reader.readStringOrNull(offset)) 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: @@ -1924,6 +1933,32 @@ extension MangaQueryFilter on QueryBuilder { }); } + QueryBuilder isMangaIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'isManga', + )); + }); + } + + QueryBuilder isMangaIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'isManga', + )); + }); + } + + QueryBuilder isMangaEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'isManga', + value: value, + )); + }); + } + QueryBuilder itemTypeEqualTo( ItemType value) { return QueryBuilder.apply(this, (query) { @@ -2903,6 +2938,18 @@ extension MangaQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByIsManga() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isManga', Sort.asc); + }); + } + + QueryBuilder sortByIsMangaDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isManga', Sort.desc); + }); + } + QueryBuilder sortByItemType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'itemType', Sort.asc); @@ -3109,6 +3156,18 @@ extension MangaQuerySortThenBy on QueryBuilder { }); } + QueryBuilder thenByIsManga() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isManga', Sort.asc); + }); + } + + QueryBuilder thenByIsMangaDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'isManga', Sort.desc); + }); + } + QueryBuilder thenByItemType() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'itemType', Sort.asc); @@ -3279,6 +3338,12 @@ extension MangaQueryWhereDistinct on QueryBuilder { }); } + QueryBuilder distinctByIsManga() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'isManga'); + }); + } + QueryBuilder distinctByItemType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'itemType'); @@ -3406,6 +3471,12 @@ extension MangaQueryProperty on QueryBuilder { }); } + QueryBuilder isMangaProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'isManga'); + }); + } + QueryBuilder itemTypeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'itemType'); diff --git a/lib/models/settings.dart b/lib/models/settings.dart index e7f19a0..4af1ade 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -215,6 +215,12 @@ class Settings { @enumerated late DisplayType novelDisplayType; + bool? hideManga; + + bool? hideAnime; + + bool? hideNovel; + Settings( {this.id = 227, this.displayType = DisplayType.compactGrid, @@ -309,7 +315,10 @@ class Settings { this.novelLibraryShowContinueReadingButton = false, this.novelLibraryLocalSource, this.sortLibraryNovel, - this.novelDisplayType = DisplayType.comfortableGrid}); + this.novelDisplayType = DisplayType.comfortableGrid, + this.hideManga = false, + this.hideAnime = false, + this.hideNovel = false}); Settings.fromJson(Map json) { animatePageTransitions = json['animatePageTransitions']; @@ -479,6 +488,9 @@ class Settings { : null; novelDisplayType = DisplayType .values[json['novelDisplayType'] ?? DisplayType.compactGrid.index]; + hideManga = json['hideManga']; + hideAnime = json['hideAnime']; + hideNovel = json['hideNovel']; } Map toJson() => { @@ -591,6 +603,9 @@ class Settings { 'novelLibraryLocalSource': novelLibraryLocalSource, 'sortLibraryNovel': sortLibraryNovel?.toJson(), 'novelDisplayType': novelDisplayType.index, + 'hideManga': hideManga, + 'hideAnime': hideAnime, + 'hideNovel': hideNovel }; } diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index 6aa5ca9..62a3670 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -267,269 +267,284 @@ const SettingsSchema = CollectionSchema( name: r'fullScreenReader', type: IsarType.bool, ), - r'incognitoMode': PropertySchema( + r'hideAnime': PropertySchema( id: 47, + name: r'hideAnime', + type: IsarType.bool, + ), + r'hideManga': PropertySchema( + id: 48, + name: r'hideManga', + type: IsarType.bool, + ), + r'hideNovel': PropertySchema( + id: 49, + name: r'hideNovel', + type: IsarType.bool, + ), + r'incognitoMode': PropertySchema( + id: 50, name: r'incognitoMode', type: IsarType.bool, ), r'libraryDownloadedChapters': PropertySchema( - id: 48, + id: 51, name: r'libraryDownloadedChapters', type: IsarType.bool, ), r'libraryFilterAnimeBookMarkedType': PropertySchema( - id: 49, + id: 52, name: r'libraryFilterAnimeBookMarkedType', type: IsarType.long, ), r'libraryFilterAnimeDownloadType': PropertySchema( - id: 50, + id: 53, name: r'libraryFilterAnimeDownloadType', type: IsarType.long, ), r'libraryFilterAnimeStartedType': PropertySchema( - id: 51, + id: 54, name: r'libraryFilterAnimeStartedType', type: IsarType.long, ), r'libraryFilterAnimeUnreadType': PropertySchema( - id: 52, + id: 55, name: r'libraryFilterAnimeUnreadType', type: IsarType.long, ), r'libraryFilterMangasBookMarkedType': PropertySchema( - id: 53, + id: 56, name: r'libraryFilterMangasBookMarkedType', type: IsarType.long, ), r'libraryFilterMangasDownloadType': PropertySchema( - id: 54, + id: 57, name: r'libraryFilterMangasDownloadType', type: IsarType.long, ), r'libraryFilterMangasStartedType': PropertySchema( - id: 55, + id: 58, name: r'libraryFilterMangasStartedType', type: IsarType.long, ), r'libraryFilterMangasUnreadType': PropertySchema( - id: 56, + id: 59, name: r'libraryFilterMangasUnreadType', type: IsarType.long, ), r'libraryFilterNovelBookMarkedType': PropertySchema( - id: 57, + id: 60, name: r'libraryFilterNovelBookMarkedType', type: IsarType.long, ), r'libraryFilterNovelDownloadType': PropertySchema( - id: 58, + id: 61, name: r'libraryFilterNovelDownloadType', type: IsarType.long, ), r'libraryFilterNovelStartedType': PropertySchema( - id: 59, + id: 62, name: r'libraryFilterNovelStartedType', type: IsarType.long, ), r'libraryFilterNovelUnreadType': PropertySchema( - id: 60, + id: 63, name: r'libraryFilterNovelUnreadType', type: IsarType.long, ), r'libraryLocalSource': PropertySchema( - id: 61, + id: 64, name: r'libraryLocalSource', type: IsarType.bool, ), r'libraryShowCategoryTabs': PropertySchema( - id: 62, + id: 65, name: r'libraryShowCategoryTabs', type: IsarType.bool, ), r'libraryShowContinueReadingButton': PropertySchema( - id: 63, + id: 66, name: r'libraryShowContinueReadingButton', type: IsarType.bool, ), r'libraryShowLanguage': PropertySchema( - id: 64, + id: 67, name: r'libraryShowLanguage', type: IsarType.bool, ), r'libraryShowNumbersOfItems': PropertySchema( - id: 65, + id: 68, name: r'libraryShowNumbersOfItems', type: IsarType.bool, ), r'locale': PropertySchema( - id: 66, + id: 69, name: r'locale', type: IsarType.object, target: r'L10nLocale', ), r'mangaGridSize': PropertySchema( - id: 67, + id: 70, name: r'mangaGridSize', type: IsarType.long, ), r'mangaHomeDisplayType': PropertySchema( - id: 68, + id: 71, name: r'mangaHomeDisplayType', type: IsarType.byte, enumMap: _SettingsmangaHomeDisplayTypeEnumValueMap, ), r'markEpisodeAsSeenType': PropertySchema( - id: 69, + id: 72, name: r'markEpisodeAsSeenType', type: IsarType.long, ), r'novelDisplayType': PropertySchema( - id: 70, + id: 73, name: r'novelDisplayType', type: IsarType.byte, enumMap: _SettingsnovelDisplayTypeEnumValueMap, ), r'novelGridSize': PropertySchema( - id: 71, + id: 74, name: r'novelGridSize', type: IsarType.long, ), r'novelLibraryDownloadedChapters': PropertySchema( - id: 72, + id: 75, name: r'novelLibraryDownloadedChapters', type: IsarType.bool, ), r'novelLibraryLocalSource': PropertySchema( - id: 73, + id: 76, name: r'novelLibraryLocalSource', type: IsarType.bool, ), r'novelLibraryShowCategoryTabs': PropertySchema( - id: 74, + id: 77, name: r'novelLibraryShowCategoryTabs', type: IsarType.bool, ), r'novelLibraryShowContinueReadingButton': PropertySchema( - id: 75, + id: 78, name: r'novelLibraryShowContinueReadingButton', type: IsarType.bool, ), r'novelLibraryShowLanguage': PropertySchema( - id: 76, + id: 79, name: r'novelLibraryShowLanguage', type: IsarType.bool, ), r'novelLibraryShowNumbersOfItems': PropertySchema( - id: 77, + id: 80, name: r'novelLibraryShowNumbersOfItems', type: IsarType.bool, ), r'onlyIncludePinnedSources': PropertySchema( - id: 78, + id: 81, name: r'onlyIncludePinnedSources', type: IsarType.bool, ), r'pagePreloadAmount': PropertySchema( - id: 79, + id: 82, name: r'pagePreloadAmount', type: IsarType.long, ), r'personalPageModeList': PropertySchema( - id: 80, + id: 83, name: r'personalPageModeList', type: IsarType.objectList, target: r'PersonalPageMode', ), r'personalReaderModeList': PropertySchema( - id: 81, + id: 84, name: r'personalReaderModeList', type: IsarType.objectList, target: r'PersonalReaderMode', ), r'playerSubtitleSettings': PropertySchema( - id: 82, + id: 85, name: r'playerSubtitleSettings', type: IsarType.object, target: r'PlayerSubtitleSettings', ), r'pureBlackDarkMode': PropertySchema( - id: 83, + id: 86, name: r'pureBlackDarkMode', type: IsarType.bool, ), r'relativeTimesTamps': PropertySchema( - id: 84, + id: 87, name: r'relativeTimesTamps', type: IsarType.long, ), r'saveAsCBZArchive': PropertySchema( - id: 85, + id: 88, name: r'saveAsCBZArchive', type: IsarType.bool, ), r'scaleType': PropertySchema( - id: 86, + id: 89, name: r'scaleType', type: IsarType.byte, enumMap: _SettingsscaleTypeEnumValueMap, ), r'showPagesNumber': PropertySchema( - id: 87, + id: 90, name: r'showPagesNumber', type: IsarType.bool, ), r'sortChapterList': PropertySchema( - id: 88, + id: 91, name: r'sortChapterList', type: IsarType.objectList, target: r'SortChapter', ), r'sortLibraryAnime': PropertySchema( - id: 89, + id: 92, name: r'sortLibraryAnime', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryManga': PropertySchema( - id: 90, + id: 93, name: r'sortLibraryManga', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryNovel': PropertySchema( - id: 91, + id: 94, name: r'sortLibraryNovel', type: IsarType.object, target: r'SortLibraryManga', ), r'startDatebackup': PropertySchema( - id: 92, + id: 95, name: r'startDatebackup', type: IsarType.long, ), r'themeIsDark': PropertySchema( - id: 93, + id: 96, name: r'themeIsDark', type: IsarType.bool, ), r'updateProgressAfterReading': PropertySchema( - id: 94, + id: 97, name: r'updateProgressAfterReading', type: IsarType.bool, ), r'useLibass': PropertySchema( - id: 95, + id: 98, name: r'useLibass', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( - id: 96, + id: 99, name: r'usePageTapZones', type: IsarType.bool, ), r'userAgent': PropertySchema( - id: 97, + id: 100, name: r'userAgent', type: IsarType.string, ) @@ -921,97 +936,100 @@ void _settingsSerialize( writer.writeLong(offsets[44], object.flexSchemeColorIndex); writer.writeBool(offsets[45], object.fullScreenPlayer); writer.writeBool(offsets[46], object.fullScreenReader); - writer.writeBool(offsets[47], object.incognitoMode); - writer.writeBool(offsets[48], object.libraryDownloadedChapters); - writer.writeLong(offsets[49], object.libraryFilterAnimeBookMarkedType); - writer.writeLong(offsets[50], object.libraryFilterAnimeDownloadType); - writer.writeLong(offsets[51], object.libraryFilterAnimeStartedType); - writer.writeLong(offsets[52], object.libraryFilterAnimeUnreadType); - writer.writeLong(offsets[53], object.libraryFilterMangasBookMarkedType); - writer.writeLong(offsets[54], object.libraryFilterMangasDownloadType); - writer.writeLong(offsets[55], object.libraryFilterMangasStartedType); - writer.writeLong(offsets[56], object.libraryFilterMangasUnreadType); - writer.writeLong(offsets[57], object.libraryFilterNovelBookMarkedType); - writer.writeLong(offsets[58], object.libraryFilterNovelDownloadType); - writer.writeLong(offsets[59], object.libraryFilterNovelStartedType); - writer.writeLong(offsets[60], object.libraryFilterNovelUnreadType); - writer.writeBool(offsets[61], object.libraryLocalSource); - writer.writeBool(offsets[62], object.libraryShowCategoryTabs); - writer.writeBool(offsets[63], object.libraryShowContinueReadingButton); - writer.writeBool(offsets[64], object.libraryShowLanguage); - writer.writeBool(offsets[65], object.libraryShowNumbersOfItems); + writer.writeBool(offsets[47], object.hideAnime); + writer.writeBool(offsets[48], object.hideManga); + writer.writeBool(offsets[49], object.hideNovel); + writer.writeBool(offsets[50], object.incognitoMode); + writer.writeBool(offsets[51], object.libraryDownloadedChapters); + writer.writeLong(offsets[52], object.libraryFilterAnimeBookMarkedType); + writer.writeLong(offsets[53], object.libraryFilterAnimeDownloadType); + writer.writeLong(offsets[54], object.libraryFilterAnimeStartedType); + writer.writeLong(offsets[55], object.libraryFilterAnimeUnreadType); + writer.writeLong(offsets[56], object.libraryFilterMangasBookMarkedType); + writer.writeLong(offsets[57], object.libraryFilterMangasDownloadType); + writer.writeLong(offsets[58], object.libraryFilterMangasStartedType); + writer.writeLong(offsets[59], object.libraryFilterMangasUnreadType); + writer.writeLong(offsets[60], object.libraryFilterNovelBookMarkedType); + writer.writeLong(offsets[61], object.libraryFilterNovelDownloadType); + writer.writeLong(offsets[62], object.libraryFilterNovelStartedType); + writer.writeLong(offsets[63], object.libraryFilterNovelUnreadType); + writer.writeBool(offsets[64], object.libraryLocalSource); + writer.writeBool(offsets[65], object.libraryShowCategoryTabs); + writer.writeBool(offsets[66], object.libraryShowContinueReadingButton); + writer.writeBool(offsets[67], object.libraryShowLanguage); + writer.writeBool(offsets[68], object.libraryShowNumbersOfItems); writer.writeObject( - offsets[66], + offsets[69], allOffsets, L10nLocaleSchema.serialize, object.locale, ); - writer.writeLong(offsets[67], object.mangaGridSize); - writer.writeByte(offsets[68], object.mangaHomeDisplayType.index); - writer.writeLong(offsets[69], object.markEpisodeAsSeenType); - writer.writeByte(offsets[70], object.novelDisplayType.index); - writer.writeLong(offsets[71], object.novelGridSize); - writer.writeBool(offsets[72], object.novelLibraryDownloadedChapters); - writer.writeBool(offsets[73], object.novelLibraryLocalSource); - writer.writeBool(offsets[74], object.novelLibraryShowCategoryTabs); - writer.writeBool(offsets[75], object.novelLibraryShowContinueReadingButton); - writer.writeBool(offsets[76], object.novelLibraryShowLanguage); - writer.writeBool(offsets[77], object.novelLibraryShowNumbersOfItems); - writer.writeBool(offsets[78], object.onlyIncludePinnedSources); - writer.writeLong(offsets[79], object.pagePreloadAmount); + writer.writeLong(offsets[70], object.mangaGridSize); + writer.writeByte(offsets[71], object.mangaHomeDisplayType.index); + writer.writeLong(offsets[72], object.markEpisodeAsSeenType); + writer.writeByte(offsets[73], object.novelDisplayType.index); + writer.writeLong(offsets[74], object.novelGridSize); + writer.writeBool(offsets[75], object.novelLibraryDownloadedChapters); + writer.writeBool(offsets[76], object.novelLibraryLocalSource); + writer.writeBool(offsets[77], object.novelLibraryShowCategoryTabs); + writer.writeBool(offsets[78], object.novelLibraryShowContinueReadingButton); + writer.writeBool(offsets[79], object.novelLibraryShowLanguage); + writer.writeBool(offsets[80], object.novelLibraryShowNumbersOfItems); + writer.writeBool(offsets[81], object.onlyIncludePinnedSources); + writer.writeLong(offsets[82], object.pagePreloadAmount); writer.writeObjectList( - offsets[80], + offsets[83], allOffsets, PersonalPageModeSchema.serialize, object.personalPageModeList, ); writer.writeObjectList( - offsets[81], + offsets[84], allOffsets, PersonalReaderModeSchema.serialize, object.personalReaderModeList, ); writer.writeObject( - offsets[82], + offsets[85], allOffsets, PlayerSubtitleSettingsSchema.serialize, object.playerSubtitleSettings, ); - writer.writeBool(offsets[83], object.pureBlackDarkMode); - writer.writeLong(offsets[84], object.relativeTimesTamps); - writer.writeBool(offsets[85], object.saveAsCBZArchive); - writer.writeByte(offsets[86], object.scaleType.index); - writer.writeBool(offsets[87], object.showPagesNumber); + writer.writeBool(offsets[86], object.pureBlackDarkMode); + writer.writeLong(offsets[87], object.relativeTimesTamps); + writer.writeBool(offsets[88], object.saveAsCBZArchive); + writer.writeByte(offsets[89], object.scaleType.index); + writer.writeBool(offsets[90], object.showPagesNumber); writer.writeObjectList( - offsets[88], + offsets[91], allOffsets, SortChapterSchema.serialize, object.sortChapterList, ); writer.writeObject( - offsets[89], + offsets[92], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryAnime, ); writer.writeObject( - offsets[90], + offsets[93], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryManga, ); writer.writeObject( - offsets[91], + offsets[94], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryNovel, ); - writer.writeLong(offsets[92], object.startDatebackup); - writer.writeBool(offsets[93], object.themeIsDark); - writer.writeBool(offsets[94], object.updateProgressAfterReading); - writer.writeBool(offsets[95], object.useLibass); - writer.writeBool(offsets[96], object.usePageTapZones); - writer.writeString(offsets[97], object.userAgent); + writer.writeLong(offsets[95], object.startDatebackup); + writer.writeBool(offsets[96], object.themeIsDark); + writer.writeBool(offsets[97], object.updateProgressAfterReading); + writer.writeBool(offsets[98], object.useLibass); + writer.writeBool(offsets[99], object.usePageTapZones); + writer.writeString(offsets[100], object.userAgent); } Settings _settingsDeserialize( @@ -1106,93 +1124,96 @@ Settings _settingsDeserialize( flexSchemeColorIndex: reader.readLongOrNull(offsets[44]), fullScreenPlayer: reader.readBoolOrNull(offsets[45]), fullScreenReader: reader.readBoolOrNull(offsets[46]), + hideAnime: reader.readBoolOrNull(offsets[47]), + hideManga: reader.readBoolOrNull(offsets[48]), + hideNovel: reader.readBoolOrNull(offsets[49]), id: id, - incognitoMode: reader.readBoolOrNull(offsets[47]), - libraryDownloadedChapters: reader.readBoolOrNull(offsets[48]), - libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[49]), - libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[50]), - libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[51]), - libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[52]), - libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[53]), - libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[54]), - libraryFilterMangasStartedType: reader.readLongOrNull(offsets[55]), - libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[56]), - libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[57]), - libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[58]), - libraryFilterNovelStartedType: reader.readLongOrNull(offsets[59]), - libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[60]), - libraryLocalSource: reader.readBoolOrNull(offsets[61]), - libraryShowCategoryTabs: reader.readBoolOrNull(offsets[62]), - libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[63]), - libraryShowLanguage: reader.readBoolOrNull(offsets[64]), - libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[65]), - mangaGridSize: reader.readLongOrNull(offsets[67]), + incognitoMode: reader.readBoolOrNull(offsets[50]), + libraryDownloadedChapters: reader.readBoolOrNull(offsets[51]), + libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[52]), + libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[53]), + libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[54]), + libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[55]), + libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[56]), + libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[57]), + libraryFilterMangasStartedType: reader.readLongOrNull(offsets[58]), + libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[59]), + libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[60]), + libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[61]), + libraryFilterNovelStartedType: reader.readLongOrNull(offsets[62]), + libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[63]), + libraryLocalSource: reader.readBoolOrNull(offsets[64]), + libraryShowCategoryTabs: reader.readBoolOrNull(offsets[65]), + libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[66]), + libraryShowLanguage: reader.readBoolOrNull(offsets[67]), + libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[68]), + mangaGridSize: reader.readLongOrNull(offsets[70]), mangaHomeDisplayType: _SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[68])] ?? + reader.readByteOrNull(offsets[71])] ?? DisplayType.comfortableGrid, - markEpisodeAsSeenType: reader.readLongOrNull(offsets[69]), + markEpisodeAsSeenType: reader.readLongOrNull(offsets[72]), novelDisplayType: _SettingsnovelDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[70])] ?? + reader.readByteOrNull(offsets[73])] ?? DisplayType.comfortableGrid, - novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[72]), - novelLibraryLocalSource: reader.readBoolOrNull(offsets[73]), - novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[74]), - novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[75]), - novelLibraryShowLanguage: reader.readBoolOrNull(offsets[76]), - novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[77]), - onlyIncludePinnedSources: reader.readBoolOrNull(offsets[78]), - pagePreloadAmount: reader.readLongOrNull(offsets[79]), + novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[75]), + novelLibraryLocalSource: reader.readBoolOrNull(offsets[76]), + novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[77]), + novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[78]), + novelLibraryShowLanguage: reader.readBoolOrNull(offsets[79]), + novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[80]), + onlyIncludePinnedSources: reader.readBoolOrNull(offsets[81]), + pagePreloadAmount: reader.readLongOrNull(offsets[82]), personalPageModeList: reader.readObjectList( - offsets[80], + offsets[83], PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), ), personalReaderModeList: reader.readObjectList( - offsets[81], + offsets[84], PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), ), playerSubtitleSettings: reader.readObjectOrNull( - offsets[82], + offsets[85], PlayerSubtitleSettingsSchema.deserialize, allOffsets, ), - pureBlackDarkMode: reader.readBoolOrNull(offsets[83]), - relativeTimesTamps: reader.readLongOrNull(offsets[84]), - saveAsCBZArchive: reader.readBoolOrNull(offsets[85]), + pureBlackDarkMode: reader.readBoolOrNull(offsets[86]), + relativeTimesTamps: reader.readLongOrNull(offsets[87]), + saveAsCBZArchive: reader.readBoolOrNull(offsets[88]), scaleType: - _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[86])] ?? + _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[89])] ?? ScaleType.fitScreen, - showPagesNumber: reader.readBoolOrNull(offsets[87]), + showPagesNumber: reader.readBoolOrNull(offsets[90]), sortChapterList: reader.readObjectList( - offsets[88], + offsets[91], SortChapterSchema.deserialize, allOffsets, SortChapter(), ), sortLibraryAnime: reader.readObjectOrNull( - offsets[89], + offsets[92], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryManga: reader.readObjectOrNull( - offsets[90], + offsets[93], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryNovel: reader.readObjectOrNull( - offsets[91], + offsets[94], SortLibraryMangaSchema.deserialize, allOffsets, ), - startDatebackup: reader.readLongOrNull(offsets[92]), - themeIsDark: reader.readBoolOrNull(offsets[93]), - updateProgressAfterReading: reader.readBoolOrNull(offsets[94]), - useLibass: reader.readBoolOrNull(offsets[95]), - usePageTapZones: reader.readBoolOrNull(offsets[96]), - userAgent: reader.readStringOrNull(offsets[97]), + startDatebackup: reader.readLongOrNull(offsets[95]), + themeIsDark: reader.readBoolOrNull(offsets[96]), + updateProgressAfterReading: reader.readBoolOrNull(offsets[97]), + useLibass: reader.readBoolOrNull(offsets[98]), + usePageTapZones: reader.readBoolOrNull(offsets[99]), + userAgent: reader.readStringOrNull(offsets[100]), ); object.chapterFilterBookmarkedList = reader.readObjectList( @@ -1214,11 +1235,11 @@ Settings _settingsDeserialize( FilterScanlator(), ); object.locale = reader.readObjectOrNull( - offsets[66], + offsets[69], L10nLocaleSchema.deserialize, allOffsets, ); - object.novelGridSize = reader.readLongOrNull(offsets[71]); + object.novelGridSize = reader.readLongOrNull(offsets[74]); return object; } @@ -1383,11 +1404,11 @@ P _settingsDeserializeProp

( case 48: return (reader.readBoolOrNull(offset)) as P; case 49: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 50: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 51: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 52: return (reader.readLongOrNull(offset)) as P; case 53: @@ -1407,41 +1428,41 @@ P _settingsDeserializeProp

( case 60: return (reader.readLongOrNull(offset)) as P; case 61: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 62: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 63: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 64: return (reader.readBoolOrNull(offset)) as P; case 65: return (reader.readBoolOrNull(offset)) as P; case 66: + return (reader.readBoolOrNull(offset)) as P; + case 67: + return (reader.readBoolOrNull(offset)) as P; + case 68: + return (reader.readBoolOrNull(offset)) as P; + case 69: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 67: + case 70: return (reader.readLongOrNull(offset)) as P; - case 68: + case 71: return (_SettingsmangaHomeDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 69: + case 72: return (reader.readLongOrNull(offset)) as P; - case 70: + case 73: return (_SettingsnovelDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 71: - return (reader.readLongOrNull(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; + return (reader.readLongOrNull(offset)) as P; case 75: return (reader.readBoolOrNull(offset)) as P; case 76: @@ -1451,74 +1472,80 @@ P _settingsDeserializeProp

( case 78: return (reader.readBoolOrNull(offset)) as P; case 79: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 80: + return (reader.readBoolOrNull(offset)) as P; + case 81: + return (reader.readBoolOrNull(offset)) as P; + case 82: + return (reader.readLongOrNull(offset)) as P; + case 83: return (reader.readObjectList( offset, PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), )) as P; - case 81: + case 84: return (reader.readObjectList( offset, PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), )) as P; - case 82: + case 85: return (reader.readObjectOrNull( offset, PlayerSubtitleSettingsSchema.deserialize, allOffsets, )) as P; - case 83: - return (reader.readBoolOrNull(offset)) as P; - case 84: - return (reader.readLongOrNull(offset)) as P; - case 85: - return (reader.readBoolOrNull(offset)) as P; case 86: + return (reader.readBoolOrNull(offset)) as P; + case 87: + return (reader.readLongOrNull(offset)) as P; + case 88: + return (reader.readBoolOrNull(offset)) as P; + case 89: return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? ScaleType.fitScreen) as P; - case 87: + case 90: return (reader.readBoolOrNull(offset)) as P; - case 88: + case 91: return (reader.readObjectList( offset, SortChapterSchema.deserialize, allOffsets, SortChapter(), )) as P; - case 89: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; - case 90: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; - case 91: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; case 92: - return (reader.readLongOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 93: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 94: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 95: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 96: return (reader.readBoolOrNull(offset)) as P; case 97: + return (reader.readBoolOrNull(offset)) as P; + case 98: + return (reader.readBoolOrNull(offset)) as P; + case 99: + return (reader.readBoolOrNull(offset)) as P; + case 100: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -5081,6 +5108,84 @@ extension SettingsQueryFilter }); } + QueryBuilder hideAnimeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'hideAnime', + )); + }); + } + + QueryBuilder hideAnimeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'hideAnime', + )); + }); + } + + QueryBuilder hideAnimeEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'hideAnime', + value: value, + )); + }); + } + + QueryBuilder hideMangaIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'hideManga', + )); + }); + } + + QueryBuilder hideMangaIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'hideManga', + )); + }); + } + + QueryBuilder hideMangaEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'hideManga', + value: value, + )); + }); + } + + QueryBuilder hideNovelIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'hideNovel', + )); + }); + } + + QueryBuilder hideNovelIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'hideNovel', + )); + }); + } + + QueryBuilder hideNovelEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'hideNovel', + value: value, + )); + }); + } + QueryBuilder idIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -8449,6 +8554,42 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByHideAnime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideAnime', Sort.asc); + }); + } + + QueryBuilder sortByHideAnimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideAnime', Sort.desc); + }); + } + + QueryBuilder sortByHideManga() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideManga', Sort.asc); + }); + } + + QueryBuilder sortByHideMangaDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideManga', Sort.desc); + }); + } + + QueryBuilder sortByHideNovel() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideNovel', Sort.asc); + }); + } + + QueryBuilder sortByHideNovelDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideNovel', Sort.desc); + }); + } + QueryBuilder sortByIncognitoMode() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'incognitoMode', Sort.asc); @@ -9503,6 +9644,42 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByHideAnime() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideAnime', Sort.asc); + }); + } + + QueryBuilder thenByHideAnimeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideAnime', Sort.desc); + }); + } + + QueryBuilder thenByHideManga() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideManga', Sort.asc); + }); + } + + QueryBuilder thenByHideMangaDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideManga', Sort.desc); + }); + } + + QueryBuilder thenByHideNovel() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideNovel', Sort.asc); + }); + } + + QueryBuilder thenByHideNovelDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'hideNovel', Sort.desc); + }); + } + QueryBuilder thenById() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'id', Sort.asc); @@ -10341,6 +10518,24 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByHideAnime() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'hideAnime'); + }); + } + + QueryBuilder distinctByHideManga() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'hideManga'); + }); + } + + QueryBuilder distinctByHideNovel() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'hideNovel'); + }); + } + QueryBuilder distinctByIncognitoMode() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'incognitoMode'); @@ -10949,6 +11144,24 @@ extension SettingsQueryProperty }); } + QueryBuilder hideAnimeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'hideAnime'); + }); + } + + QueryBuilder hideMangaProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'hideManga'); + }); + } + + QueryBuilder hideNovelProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'hideNovel'); + }); + } + QueryBuilder incognitoModeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'incognitoMode'); diff --git a/lib/models/source.dart b/lib/models/source.dart index 71f6a45..9f3e812 100644 --- a/lib/models/source.dart +++ b/lib/models/source.dart @@ -125,6 +125,38 @@ class Source { SourceCodeLanguage.values[json['sourceCodeLanguage'] ?? 0]; } + Source.fromJsonV1(Map json) { + apiUrl = json['apiUrl']; + appMinVerReq = json['appMinVerReq']; + baseUrl = json['baseUrl']; + dateFormat = json['dateFormat']; + dateFormatLocale = json['dateFormatLocale']; + hasCloudflare = json['hasCloudflare']; + headers = json['headers']; + iconUrl = json['iconUrl']; + id = json['id']; + isActive = json['isActive']; + isAdded = json['isAdded']; + isFullData = json['isFullData']; + isManga = json['isManga']; + itemType = isManga == true ? ItemType.manga : ItemType.anime; + isNsfw = json['isNsfw']; + isPinned = json['isPinned']; + lang = json['lang']; + lastUsed = json['lastUsed']; + name = json['name']; + sourceCode = json['sourceCode']; + sourceCodeUrl = json['sourceCodeUrl']; + typeSource = json['typeSource']; + version = json['version']; + versionLast = json['versionLast']; + additionalParams = json['additionalParams'] ?? ""; + isObsolete = json['isObsolete']; + isLocal = json['isLocal']; + sourceCodeLanguage = + SourceCodeLanguage.values[json['sourceCodeLanguage'] ?? 0]; + } + Map toJson() => { 'apiUrl': apiUrl, 'appMinVerReq': appMinVerReq, diff --git a/lib/modules/history/history_screen.dart b/lib/modules/history/history_screen.dart index 4723f15..5d821ba 100644 --- a/lib/modules/history/history_screen.dart +++ b/lib/modules/history/history_screen.dart @@ -10,6 +10,7 @@ import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/history/providers/isar_providers.dart'; +import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/cached_network.dart'; import 'package:mangayomi/utils/constant.dart'; @@ -30,17 +31,20 @@ class HistoryScreen extends ConsumerStatefulWidget { class _HistoryScreenState extends ConsumerState with TickerProviderStateMixin { late TabController _tabBarController; + int tabs = 3; + + void tabListener() { + setState(() { + _textEditingController.clear(); + _isSearch = false; + }); + } @override void initState() { - _tabBarController = TabController(length: 3, vsync: this); + _tabBarController = TabController(length: tabs, vsync: this); _tabBarController.animateTo(0); - _tabBarController.addListener(() { - setState(() { - _textEditingController.clear(); - _isSearch = false; - }); - }); + _tabBarController.addListener(tabListener); super.initState(); } @@ -49,10 +53,27 @@ class _HistoryScreenState extends ConsumerState List entriesData = []; @override Widget build(BuildContext context) { + int newTabs = 0; + final hideManga = ref.watch(hideMangaStateProvider); + final hideAnime = ref.watch(hideAnimeStateProvider); + final hideNovel = ref.watch(hideNovelStateProvider); + if (!hideManga) newTabs++; + if (!hideAnime) newTabs++; + if (!hideNovel) newTabs++; + if (tabs != newTabs) { + _tabBarController.removeListener(tabListener); + _tabBarController.dispose(); + _tabBarController = TabController(length: newTabs, vsync: this); + _tabBarController.animateTo(0); + _tabBarController.addListener(tabListener); + setState(() { + tabs = newTabs; + }); + } final l10n = l10nLocalizations(context)!; return DefaultTabController( animationDuration: Duration.zero, - length: 2, + length: newTabs, child: Scaffold( appBar: AppBar( elevation: 0, @@ -120,10 +141,16 @@ class _HistoryScreenState extends ConsumerState .idIsNotNull() .chapter((q) => q.manga((q) => q .itemTypeEqualTo(_tabBarController - .index == - 0 + .index == + 0 && + !hideManga ? ItemType.manga - : _tabBarController.index == 1 + : _tabBarController.index == + 1 - + (hideManga + ? 1 + : 0) && + !hideAnime ? ItemType.anime : ItemType.novel))) .findAllSync() @@ -151,27 +178,30 @@ class _HistoryScreenState extends ConsumerState indicatorSize: TabBarIndicatorSize.tab, controller: _tabBarController, tabs: [ - Tab(text: l10n.manga), - Tab(text: l10n.anime), - Tab(text: l10n.novel), + if (!hideManga) Tab(text: l10n.manga), + if (!hideAnime) Tab(text: l10n.anime), + if (!hideNovel) Tab(text: l10n.novel), ], ), ), body: Padding( padding: const EdgeInsets.only(top: 10), child: TabBarView(controller: _tabBarController, children: [ - HistoryTab( - itemType: ItemType.manga, - query: _textEditingController.text, - ), - HistoryTab( - itemType: ItemType.anime, - query: _textEditingController.text, - ), - HistoryTab( - itemType: ItemType.novel, - query: _textEditingController.text, - ) + if (!hideManga) + HistoryTab( + itemType: ItemType.manga, + query: _textEditingController.text, + ), + if (!hideAnime) + HistoryTab( + itemType: ItemType.anime, + query: _textEditingController.text, + ), + if (!hideNovel) + HistoryTab( + itemType: ItemType.novel, + query: _textEditingController.text, + ) ]), ), ), diff --git a/lib/modules/main_view/main_screen.dart b/lib/modules/main_view/main_screen.dart index 53c4ebc..6efe6e8 100644 --- a/lib/modules/main_view/main_screen.dart +++ b/lib/modules/main_view/main_screen.dart @@ -7,6 +7,7 @@ import 'package:isar/isar.dart'; import 'package:mangayomi/main.dart'; import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/source.dart'; +import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/widgets/loading_icon.dart'; import 'package:mangayomi/services/fetch_anime_sources.dart'; import 'package:mangayomi/services/fetch_manga_sources.dart'; @@ -54,17 +55,34 @@ class MainScreen extends ConsumerWidget { final location = ref.watch( routerCurrentLocationStateProvider(context), ); - bool isReadingScreen = - location == '/mangaReaderView' || location == '/animePlayerView' || location == '/novelReaderView'; - int currentIndex = switch (location) { - null || '/MangaLibrary' => 0, - '/AnimeLibrary' => 1, - '/NovelLibrary' => 2, - '/updates' => 3, - '/history' => 4, - '/browse' => 5, - _ => 6, - }; + final hideManga = ref.watch(hideMangaStateProvider); + final hideAnime = ref.watch(hideAnimeStateProvider); + final hideNovel = ref.watch(hideNovelStateProvider); + bool isReadingScreen = location == '/mangaReaderView' || + location == '/animePlayerView' || + location == '/novelReaderView'; + final dest = [ + '/MangaLibrary', + '/AnimeLibrary', + '/NovelLibrary', + '/updates', + '/history', + '/browse', + '/more' + ]; + if (hideManga) { + dest.removeWhere((d) => d == "/MangaLibrary"); + } + if (hideAnime) { + dest.removeWhere((d) => d == "/AnimeLibrary"); + } + if (hideNovel) { + dest.removeWhere((d) => d == "/NovelLibrary"); + } + int currentIndex = dest.indexOf(location ?? "/more"); + if (currentIndex == -1) { + currentIndex = dest.length - 1; + } final incognitoMode = ref.watch(incognitoModeStateProvider); final isLongPressed = ref.watch(isLongPressedMangaStateProvider); @@ -134,38 +152,50 @@ class MainScreen extends ConsumerWidget { labelType: NavigationRailLabelType.all, useIndicator: true, destinations: [ + if (!hideManga) + NavigationRailDestination( + selectedIcon: const Icon( + Icons.collections_bookmark), + icon: const Icon(Icons + .collections_bookmark_outlined), + label: Padding( + padding: + const EdgeInsets.only( + top: 5), + child: Text(l10n.manga))), + if (!hideAnime) + NavigationRailDestination( + selectedIcon: const Icon( + Icons.video_collection), + icon: const Icon(Icons + .video_collection_outlined), + label: Padding( + padding: + const EdgeInsets.only( + top: 5), + child: Text(l10n.anime))), + if (!hideNovel) + NavigationRailDestination( + selectedIcon: const Icon( + Icons.local_library), + icon: const Icon( + Icons.local_library_outlined), + label: Padding( + padding: + const EdgeInsets.only( + top: 5), + child: Text(l10n.novel))), NavigationRailDestination( - selectedIcon: const Icon( - Icons.collections_bookmark), - icon: const Icon(Icons - .collections_bookmark_outlined), - label: Padding( - padding: const EdgeInsets.only( - top: 5), - child: Text(l10n.manga))), - NavigationRailDestination( - selectedIcon: const Icon( - Icons.video_collection), - icon: const Icon(Icons - .video_collection_outlined), - label: Padding( - padding: const EdgeInsets.only( - top: 5), - child: Text(l10n.anime))), - NavigationRailDestination( - selectedIcon: const Icon( - Icons.local_library), - icon: const Icon(Icons - .local_library_outlined), - label: Padding( - padding: const EdgeInsets.only( - top: 5), - child: Text(l10n.novel))), - NavigationRailDestination( - selectedIcon: - const Icon(Icons.new_releases), - icon: const Icon( - Icons.new_releases_outlined), + selectedIcon: Badge( + label: _updatesTotalNumbers(ref), + child: const Icon( + Icons.new_releases), + ), + icon: Badge( + label: _updatesTotalNumbers(ref), + child: const Icon( + Icons.new_releases_outlined), + ), label: Padding( padding: const EdgeInsets.only( top: 5), @@ -194,10 +224,19 @@ class MainScreen extends ConsumerWidget { top: 5), child: Text(l10n.history))), NavigationRailDestination( - selectedIcon: - const Icon(Icons.explore), - icon: const Icon( - Icons.explore_outlined), + selectedIcon: Badge( + label: + _extensionUpdateTotalNumbers( + ref), + child: const Icon(Icons.explore), + ), + icon: Badge( + label: + _extensionUpdateTotalNumbers( + ref), + child: const Icon( + Icons.explore_outlined), + ), label: Padding( padding: const EdgeInsets.only( top: 5), @@ -214,28 +253,34 @@ class MainScreen extends ConsumerWidget { ], selectedIndex: currentIndex, onDestinationSelected: (newIndex) { - final fn = switch (newIndex) { - 0 => route.go('/MangaLibrary'), - 1 => route.go('/AnimeLibrary'), - 2 => route.go('/NovelLibrary'), - 3 => route.go('/updates'), - 4 => route.go('/history'), - 5 => route.go('/browse'), - _ => route.go('/more'), - }; - fn; + final dest = [ + '/MangaLibrary', + '/AnimeLibrary', + '/NovelLibrary', + '/updates', + '/history', + '/browse', + '/more' + ]; + if (hideManga) { + dest.removeWhere( + (d) => d == "/MangaLibrary"); + } + if (hideAnime) { + dest.removeWhere( + (d) => d == "/AnimeLibrary"); + } + if (hideNovel) { + dest.removeWhere( + (d) => d == "/NovelLibrary"); + } + route.go(dest[newIndex >= dest.length + ? dest.length - 1 + : newIndex]); }, ); }), ), - Positioned( - right: 18, - top: 140, - child: _updatesTotalNumbers(ref)), - Positioned( - right: 18, - top: 275, - child: _extensionUpdateTotalNumbers(ref)), ], ), ), @@ -273,70 +318,76 @@ class MainScreen extends ConsumerWidget { const Duration(milliseconds: 500), selectedIndex: currentIndex, destinations: [ + if (!hideManga) + NavigationDestination( + selectedIcon: + const Icon(Icons.collections_bookmark), + icon: const Icon( + Icons.collections_bookmark_outlined), + label: l10n.manga), + if (!hideAnime) + NavigationDestination( + selectedIcon: + const Icon(Icons.video_collection), + icon: const Icon( + Icons.video_collection_outlined), + label: l10n.anime), + if (!hideNovel) + NavigationDestination( + selectedIcon: + const Icon(Icons.local_library), + icon: const Icon( + Icons.local_library_outlined), + label: l10n.novel), NavigationDestination( - selectedIcon: - const Icon(Icons.collections_bookmark), - icon: const Icon( - Icons.collections_bookmark_outlined), - label: l10n.manga), - NavigationDestination( - selectedIcon: - const Icon(Icons.video_collection), - icon: const Icon( - Icons.video_collection_outlined), - label: l10n.anime), - NavigationDestination( - selectedIcon: - const Icon(Icons.local_library), - icon: const Icon( - Icons.local_library_outlined), - label: l10n.novel), - Stack( - children: [ - NavigationDestination( - selectedIcon: - const Icon(Icons.new_releases), - icon: const Icon( - Icons.new_releases_outlined), - label: l10n.updates), - Positioned( - right: 14, - top: 3, - child: _updatesTotalNumbers(ref)), - ], - ), + selectedIcon: Badge( + label: _updatesTotalNumbers(ref), + child: const Icon(Icons.new_releases), + ), + icon: Badge( + label: _updatesTotalNumbers(ref), + child: const Icon(Icons.new_releases), + ), + label: l10n.updates), NavigationDestination( selectedIcon: const Icon(Icons.history), icon: const Icon(Icons.history_outlined), label: l10n.history), - Stack( - children: [ - NavigationDestination( - selectedIcon: const Icon(Icons.explore), - icon: const Icon(Icons.explore_outlined), - label: l10n.browse), - Positioned( - right: 14, - top: 3, - child: _extensionUpdateTotalNumbers(ref)), - ], - ), + NavigationDestination( + selectedIcon: Badge( + label: _extensionUpdateTotalNumbers(ref), + child: const Icon(Icons.explore)), + icon: Badge( + label: _extensionUpdateTotalNumbers(ref), + child: const Icon(Icons.explore)), + label: l10n.browse), NavigationDestination( selectedIcon: const Icon(Icons.more_horiz), icon: const Icon(Icons.more_horiz_outlined), label: l10n.more), ], onDestinationSelected: (newIndex) { - final fn = switch (newIndex) { - 0 => route.go('/MangaLibrary'), - 1 => route.go('/AnimeLibrary'), - 2 => route.go('/NovelLibrary'), - 3 => route.go('/updates'), - 4 => route.go('/history'), - 5 => route.go('/browse'), - _ => route.go('/more'), - }; - fn; + final dest = [ + '/MangaLibrary', + '/AnimeLibrary', + '/NovelLibrary', + '/updates', + '/history', + '/browse', + '/more' + ]; + if (hideManga) { + dest.removeWhere((d) => d == "/MangaLibrary"); + } + if (hideAnime) { + dest.removeWhere((d) => d == "/AnimeLibrary"); + } + if (hideNovel) { + dest.removeWhere((d) => d == "/NovelLibrary"); + } + route.go(dest[newIndex >= dest.length + ? dest.length - 1 + : newIndex]); }, ), ), @@ -368,25 +419,9 @@ Widget _extensionUpdateTotalNumbers(WidgetRef ref) { .where((element) => compareVersions(element.version!, element.versionLast!) < 0) .toList(); - return entries.isEmpty - ? Container() - : Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: const Color.fromARGB(255, 176, 46, 37)), - child: Padding( - padding: - const EdgeInsets.symmetric(horizontal: 5, vertical: 3), - child: Text( - entries.length.toString(), - style: TextStyle( - fontSize: 10, - color: Theme.of(context).textTheme.bodySmall!.color), - ), - ), - ); + return entries.isEmpty ? Text("0") : Text("${entries.length}"); } - return Container(); + return Text("0"); }); } @@ -401,24 +436,8 @@ Widget _updatesTotalNumbers(WidgetRef ref) { } return !(element.chapter.value?.isRead ?? false); }).toList(); - return entries.isEmpty - ? Container() - : Container( - decoration: BoxDecoration( - borderRadius: BorderRadius.circular(10), - color: const Color.fromARGB(255, 176, 46, 37)), - child: Padding( - padding: - const EdgeInsets.symmetric(horizontal: 5, vertical: 3), - child: Text( - entries.length.toString(), - style: TextStyle( - fontSize: 10, - color: Theme.of(context).textTheme.bodySmall!.color), - ), - ), - ); + return entries.isEmpty ? Text("0") : Text("${entries.length}"); } - return Container(); + return Text("0"); }); } diff --git a/lib/modules/more/backup_and_restore/backup_and_restore.dart b/lib/modules/more/backup_and_restore/backup_and_restore.dart index 71aef1c..26b809f 100644 --- a/lib/modules/more/backup_and_restore/backup_and_restore.dart +++ b/lib/modules/more/backup_and_restore/backup_and_restore.dart @@ -385,7 +385,8 @@ List _getList(BuildContext context) { l10n.tracking, l10n.history, l10n.settings, - l10n.extensions + l10n.extensions, + l10n.updates ]; } diff --git a/lib/modules/more/backup_and_restore/providers/backup.dart b/lib/modules/more/backup_and_restore/providers/backup.dart index a973f0b..3e4e2d2 100644 --- a/lib/modules/more/backup_and_restore/providers/backup.dart +++ b/lib/modules/more/backup_and_restore/providers/backup.dart @@ -15,6 +15,7 @@ import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/models/track.dart'; import 'package:mangayomi/models/track_preference.dart'; +import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -28,7 +29,7 @@ void doBackUp(Ref ref, required String path, required BuildContext? context}) { Map datas = {}; - datas.addAll({"version": "1"}); + datas.addAll({"version": "2"}); if (list.contains(0)) { final res = isar.mangas .filter() @@ -116,6 +117,15 @@ void doBackUp(Ref ref, .toList(); datas.addAll({"extensions_preferences": resSourePref}); } + if (list.contains(7)) { + final res = isar.updates + .filter() + .idIsNotNull() + .findAllSync() + .map((e) => e.toJson()) + .toList(); + datas.addAll({"updates": res}); + } final regExp = RegExp(r'[^a-zA-Z0-9 .()\-\s]'); final name = 'mangayomi_${DateTime.now().toString().replaceAll(regExp, '_').replaceAll(' ', '_')}'; diff --git a/lib/modules/more/backup_and_restore/providers/backup.g.dart b/lib/modules/more/backup_and_restore/providers/backup.g.dart index a0d4695..6279730 100644 --- a/lib/modules/more/backup_and_restore/providers/backup.g.dart +++ b/lib/modules/more/backup_and_restore/providers/backup.g.dart @@ -6,7 +6,7 @@ part of 'backup.dart'; // RiverpodGenerator // ************************************************************************** -String _$doBackUpHash() => r'1082dfee2a9c9e5655a04d027fde40c29d634a6d'; +String _$doBackUpHash() => r'98c1eb56bd4937033c82accf71beb84c85a2acc6'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/more/backup_and_restore/providers/restore.dart b/lib/modules/more/backup_and_restore/providers/restore.dart index cd6c9b9..7926865 100644 --- a/lib/modules/more/backup_and_restore/providers/restore.dart +++ b/lib/modules/more/backup_and_restore/providers/restore.dart @@ -32,143 +32,274 @@ void doRestore(Ref ref, {required String path, required BuildContext context}) { final backup = jsonDecode(utf8.decode(archive.files.first.content)) as Map; if (backup['version'] == "1") { - try { - final manga = - (backup["manga"] as List?)?.map((e) => Manga.fromJson(e)).toList(); - final chapters = (backup["chapters"] as List?) - ?.map((e) => Chapter.fromJson(e)) - .toList(); - final categories = (backup["categories"] as List?) - ?.map((e) => Category.fromJson(e)) - .toList(); - final track = - (backup["tracks"] as List?)?.map((e) => Track.fromJson(e)).toList(); - final trackPreferences = (backup["trackPreferences"] as List?) - ?.map((e) => TrackPreference.fromJson(e)) - .toList(); - final history = (backup["history"] as List?) - ?.map((e) => History.fromJson(e)) - .toList(); - final downloads = (backup["downloads"] as List?) - ?.map((e) => Download.fromJson(e)) - .toList(); - final settings = (backup["settings"] as List?) - ?.map((e) => Settings.fromJson(e)) - .toList(); - final extensions = (backup["extensions"] as List?) - ?.map((e) => Source.fromJson(e)) - .toList(); - final extensionsPref = (backup["extensions_preferences"] as List?) - ?.map((e) => SourcePreference.fromJson(e)) - .toList(); - final updates = - (backup["updates"] as List?)?.map((e) => Update.fromJson(e)).toList(); + restoreV1(ref, backup); + } else if (backup['version'] == "2") { + restoreV2(ref, backup); + } + BotToast.showNotification( + animationDuration: const Duration(milliseconds: 200), + animationReverseDuration: const Duration(milliseconds: 200), + duration: const Duration(seconds: 5), + backButtonBehavior: BackButtonBehavior.none, + leading: (_) => Image.asset('assets/app_icons/icon-red.png', height: 40), + title: (_) => const Text( + "Backup restored!", + style: TextStyle(fontWeight: FontWeight.bold), + ), + enableSlideOff: true, + onlyOne: true, + crossPage: true); +} - isar.writeTxnSync(() { - isar.mangas.clearSync(); - if (manga != null) { - isar.mangas.putAllSync(manga); - if (chapters != null) { - isar.chapters.clearSync(); - for (var chapter in chapters) { - final manga = isar.mangas.getSync(chapter.mangaId!); - if (manga != null) { - isar.chapters.putSync(chapter..manga.value = manga); - chapter.manga.saveSync(); - } +@riverpod +void restoreV1(Ref ref, Map backup) { + try { + final manga = + (backup["manga"] as List?)?.map((e) => Manga.fromJsonV1(e)).toList(); + final chapters = + (backup["chapters"] as List?)?.map((e) => Chapter.fromJson(e)).toList(); + final categories = (backup["categories"] as List?) + ?.map((e) => Category.fromJsonV1(e)) + .toList(); + final track = + (backup["tracks"] as List?)?.map((e) => Track.fromJson(e)).toList(); + final trackPreferences = (backup["trackPreferences"] as List?) + ?.map((e) => TrackPreference.fromJson(e)) + .toList(); + final history = (backup["history"] as List?) + ?.map((e) => History.fromJsonV1(e)) + .toList(); + final downloads = (backup["downloads"] as List?) + ?.map((e) => Download.fromJson(e)) + .toList(); + final settings = (backup["settings"] as List?) + ?.map((e) => Settings.fromJson(e)) + .toList(); + final extensions = (backup["extensions"] as List?) + ?.map((e) => Source.fromJsonV1(e)) + .toList(); + final extensionsPref = (backup["extensions_preferences"] as List?) + ?.map((e) => SourcePreference.fromJson(e)) + .toList(); + final updates = + (backup["updates"] as List?)?.map((e) => Update.fromJson(e)).toList(); + + isar.writeTxnSync(() { + isar.mangas.clearSync(); + if (manga != null) { + isar.mangas.putAllSync(manga); + if (chapters != null) { + isar.chapters.clearSync(); + for (var chapter in chapters) { + final manga = isar.mangas.getSync(chapter.mangaId!); + if (manga != null) { + isar.chapters.putSync(chapter..manga.value = manga); + chapter.manga.saveSync(); } + } - isar.downloads.clearSync(); - if (downloads != null) { - for (var download in downloads) { - final chapter = isar.chapters.getSync(download.chapterId!); - if (chapter != null) { - isar.downloads.putSync(download..chapter.value = chapter); - download.chapter.saveSync(); - } - } - } - - isar.historys.clearSync(); - if (history != null) { - for (var element in history) { - final chapter = isar.chapters.getSync(element.chapterId!); - if (chapter != null) { - isar.historys.putSync(element..chapter.value = chapter); - element.chapter.saveSync(); - } - } - } - - isar.updates.clearSync(); - if (updates != null) { - final tempChapters = - isar.chapters.filter().idIsNotNull().findAllSync().toList(); - for (var update in updates) { - final matchingChapter = tempChapters - .where((chapter) => - chapter.mangaId == update.mangaId && - chapter.name == update.chapterName) - .firstOrNull; - if (matchingChapter != null) { - isar.updates.putSync(update..chapter.value = matchingChapter); - update.chapter.saveSync(); - } + isar.downloads.clearSync(); + if (downloads != null) { + for (var download in downloads) { + final chapter = isar.chapters.getSync(download.chapterId!); + if (chapter != null) { + isar.downloads.putSync(download..chapter.value = chapter); + download.chapter.saveSync(); } } } - isar.categorys.clearSync(); - if (categories != null) { - isar.categorys.putAllSync(categories); + isar.historys.clearSync(); + if (history != null) { + for (var element in history) { + final chapter = isar.chapters.getSync(element.chapterId!); + if (chapter != null) { + isar.historys.putSync(element..chapter.value = chapter); + element.chapter.saveSync(); + } + } + } + + isar.updates.clearSync(); + if (updates != null) { + final tempChapters = + isar.chapters.filter().idIsNotNull().findAllSync().toList(); + for (var update in updates) { + final matchingChapter = tempChapters + .where((chapter) => + chapter.mangaId == update.mangaId && + chapter.name == update.chapterName) + .firstOrNull; + if (matchingChapter != null) { + isar.updates.putSync(update..chapter.value = matchingChapter); + update.chapter.saveSync(); + } + } } } - isar.tracks.clearSync(); - if (track != null) { - isar.tracks.putAllSync(track); + isar.categorys.clearSync(); + if (categories != null) { + isar.categorys.putAllSync(categories); } + } - isar.trackPreferences.clearSync(); - if (trackPreferences != null) { - isar.trackPreferences.putAllSync(trackPreferences); - } + isar.tracks.clearSync(); + if (track != null) { + isar.tracks.putAllSync(track); + } - isar.sources.clearSync(); - if (extensions != null) { - isar.sources.putAllSync(extensions); - } + isar.trackPreferences.clearSync(); + if (trackPreferences != null) { + isar.trackPreferences.putAllSync(trackPreferences); + } - isar.sourcePreferences.clearSync(); - if (extensionsPref != null) { - isar.sourcePreferences.putAllSync(extensionsPref); - } - isar.settings.clearSync(); - if (settings != null) { - isar.settings.putAllSync(settings); - } - ref.invalidate(themeModeStateProvider); - ref.invalidate(blendLevelStateProvider); - ref.invalidate(flexSchemeColorStateProvider); - ref.invalidate(pureBlackDarkModeStateProvider); - ref.invalidate(l10nLocaleStateProvider); - }); - } catch (e) { - botToast(e.toString()); - } - BotToast.showNotification( - animationDuration: const Duration(milliseconds: 200), - animationReverseDuration: const Duration(milliseconds: 200), - duration: const Duration(seconds: 5), - backButtonBehavior: BackButtonBehavior.none, - leading: (_) => - Image.asset('assets/app_icons/icon-red.png', height: 40), - title: (_) => const Text( - "Backup restored!", - style: TextStyle(fontWeight: FontWeight.bold), - ), - enableSlideOff: true, - onlyOne: true, - crossPage: true); + isar.sources.clearSync(); + if (extensions != null) { + isar.sources.putAllSync(extensions); + } + + isar.sourcePreferences.clearSync(); + if (extensionsPref != null) { + isar.sourcePreferences.putAllSync(extensionsPref); + } + isar.settings.clearSync(); + if (settings != null) { + isar.settings.putAllSync(settings); + } + ref.invalidate(themeModeStateProvider); + ref.invalidate(blendLevelStateProvider); + ref.invalidate(flexSchemeColorStateProvider); + ref.invalidate(pureBlackDarkModeStateProvider); + ref.invalidate(l10nLocaleStateProvider); + }); + } catch (e) { + botToast(e.toString()); + } +} + +@riverpod +void restoreV2(Ref ref, Map backup) { + try { + final manga = + (backup["manga"] as List?)?.map((e) => Manga.fromJson(e)).toList(); + final chapters = + (backup["chapters"] as List?)?.map((e) => Chapter.fromJson(e)).toList(); + final categories = (backup["categories"] as List?) + ?.map((e) => Category.fromJson(e)) + .toList(); + final track = + (backup["tracks"] as List?)?.map((e) => Track.fromJson(e)).toList(); + final trackPreferences = (backup["trackPreferences"] as List?) + ?.map((e) => TrackPreference.fromJson(e)) + .toList(); + final history = + (backup["history"] as List?)?.map((e) => History.fromJson(e)).toList(); + final downloads = (backup["downloads"] as List?) + ?.map((e) => Download.fromJson(e)) + .toList(); + final settings = (backup["settings"] as List?) + ?.map((e) => Settings.fromJson(e)) + .toList(); + final extensions = (backup["extensions"] as List?) + ?.map((e) => Source.fromJson(e)) + .toList(); + final extensionsPref = (backup["extensions_preferences"] as List?) + ?.map((e) => SourcePreference.fromJson(e)) + .toList(); + final updates = + (backup["updates"] as List?)?.map((e) => Update.fromJson(e)).toList(); + + isar.writeTxnSync(() { + isar.mangas.clearSync(); + if (manga != null) { + isar.mangas.putAllSync(manga); + if (chapters != null) { + isar.chapters.clearSync(); + for (var chapter in chapters) { + final manga = isar.mangas.getSync(chapter.mangaId!); + if (manga != null) { + isar.chapters.putSync(chapter..manga.value = manga); + chapter.manga.saveSync(); + } + } + + isar.downloads.clearSync(); + if (downloads != null) { + for (var download in downloads) { + final chapter = isar.chapters.getSync(download.chapterId!); + if (chapter != null) { + isar.downloads.putSync(download..chapter.value = chapter); + download.chapter.saveSync(); + } + } + } + + isar.historys.clearSync(); + if (history != null) { + for (var element in history) { + final chapter = isar.chapters.getSync(element.chapterId!); + if (chapter != null) { + isar.historys.putSync(element..chapter.value = chapter); + element.chapter.saveSync(); + } + } + } + + isar.updates.clearSync(); + if (updates != null) { + final tempChapters = + isar.chapters.filter().idIsNotNull().findAllSync().toList(); + for (var update in updates) { + final matchingChapter = tempChapters + .where((chapter) => + chapter.mangaId == update.mangaId && + chapter.name == update.chapterName) + .firstOrNull; + if (matchingChapter != null) { + isar.updates.putSync(update..chapter.value = matchingChapter); + update.chapter.saveSync(); + } + } + } + } + + isar.categorys.clearSync(); + if (categories != null) { + isar.categorys.putAllSync(categories); + } + } + + isar.tracks.clearSync(); + if (track != null) { + isar.tracks.putAllSync(track); + } + + isar.trackPreferences.clearSync(); + if (trackPreferences != null) { + isar.trackPreferences.putAllSync(trackPreferences); + } + + isar.sources.clearSync(); + if (extensions != null) { + isar.sources.putAllSync(extensions); + } + + isar.sourcePreferences.clearSync(); + if (extensionsPref != null) { + isar.sourcePreferences.putAllSync(extensionsPref); + } + isar.settings.clearSync(); + if (settings != null) { + isar.settings.putAllSync(settings); + } + ref.invalidate(themeModeStateProvider); + ref.invalidate(blendLevelStateProvider); + ref.invalidate(flexSchemeColorStateProvider); + ref.invalidate(pureBlackDarkModeStateProvider); + ref.invalidate(l10nLocaleStateProvider); + }); + } catch (e) { + botToast(e.toString()); } } diff --git a/lib/modules/more/backup_and_restore/providers/restore.g.dart b/lib/modules/more/backup_and_restore/providers/restore.g.dart index a490e46..f55b607 100644 --- a/lib/modules/more/backup_and_restore/providers/restore.g.dart +++ b/lib/modules/more/backup_and_restore/providers/restore.g.dart @@ -6,7 +6,7 @@ part of 'restore.dart'; // RiverpodGenerator // ************************************************************************** -String _$doRestoreHash() => r'15a02b8de4cc4c7f5185a9f645b734a75f5950ca'; +String _$doRestoreHash() => r'508725e75a03ac5f561c2cf8bf4943052d605d5b'; /// Copied from Dart SDK class _SystemHash { @@ -172,5 +172,263 @@ class _DoRestoreProviderElement extends AutoDisposeProviderElement @override BuildContext get context => (origin as DoRestoreProvider).context; } + +String _$restoreV1Hash() => r'4dca1ac4cec79fdc78bec4d71367e77caf696f17'; + +/// See also [restoreV1]. +@ProviderFor(restoreV1) +const restoreV1Provider = RestoreV1Family(); + +/// See also [restoreV1]. +class RestoreV1Family extends Family { + /// See also [restoreV1]. + const RestoreV1Family(); + + /// See also [restoreV1]. + RestoreV1Provider call( + Map backup, + ) { + return RestoreV1Provider( + backup, + ); + } + + @override + RestoreV1Provider getProviderOverride( + covariant RestoreV1Provider provider, + ) { + return call( + provider.backup, + ); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'restoreV1Provider'; +} + +/// See also [restoreV1]. +class RestoreV1Provider extends AutoDisposeProvider { + /// See also [restoreV1]. + RestoreV1Provider( + Map backup, + ) : this._internal( + (ref) => restoreV1( + ref as RestoreV1Ref, + backup, + ), + from: restoreV1Provider, + name: r'restoreV1Provider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$restoreV1Hash, + dependencies: RestoreV1Family._dependencies, + allTransitiveDependencies: RestoreV1Family._allTransitiveDependencies, + backup: backup, + ); + + RestoreV1Provider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.backup, + }) : super.internal(); + + final Map backup; + + @override + Override overrideWith( + void Function(RestoreV1Ref provider) create, + ) { + return ProviderOverride( + origin: this, + override: RestoreV1Provider._internal( + (ref) => create(ref as RestoreV1Ref), + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + backup: backup, + ), + ); + } + + @override + AutoDisposeProviderElement createElement() { + return _RestoreV1ProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is RestoreV1Provider && other.backup == backup; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, backup.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin RestoreV1Ref on AutoDisposeProviderRef { + /// The parameter `backup` of this provider. + Map get backup; +} + +class _RestoreV1ProviderElement extends AutoDisposeProviderElement + with RestoreV1Ref { + _RestoreV1ProviderElement(super.provider); + + @override + Map get backup => (origin as RestoreV1Provider).backup; +} + +String _$restoreV2Hash() => r'fbdd1978f8be7512277620e351b9a0eee1827bfc'; + +/// See also [restoreV2]. +@ProviderFor(restoreV2) +const restoreV2Provider = RestoreV2Family(); + +/// See also [restoreV2]. +class RestoreV2Family extends Family { + /// See also [restoreV2]. + const RestoreV2Family(); + + /// See also [restoreV2]. + RestoreV2Provider call( + Map backup, + ) { + return RestoreV2Provider( + backup, + ); + } + + @override + RestoreV2Provider getProviderOverride( + covariant RestoreV2Provider provider, + ) { + return call( + provider.backup, + ); + } + + static const Iterable? _dependencies = null; + + @override + Iterable? get dependencies => _dependencies; + + static const Iterable? _allTransitiveDependencies = null; + + @override + Iterable? get allTransitiveDependencies => + _allTransitiveDependencies; + + @override + String? get name => r'restoreV2Provider'; +} + +/// See also [restoreV2]. +class RestoreV2Provider extends AutoDisposeProvider { + /// See also [restoreV2]. + RestoreV2Provider( + Map backup, + ) : this._internal( + (ref) => restoreV2( + ref as RestoreV2Ref, + backup, + ), + from: restoreV2Provider, + name: r'restoreV2Provider', + debugGetCreateSourceHash: + const bool.fromEnvironment('dart.vm.product') + ? null + : _$restoreV2Hash, + dependencies: RestoreV2Family._dependencies, + allTransitiveDependencies: RestoreV2Family._allTransitiveDependencies, + backup: backup, + ); + + RestoreV2Provider._internal( + super._createNotifier, { + required super.name, + required super.dependencies, + required super.allTransitiveDependencies, + required super.debugGetCreateSourceHash, + required super.from, + required this.backup, + }) : super.internal(); + + final Map backup; + + @override + Override overrideWith( + void Function(RestoreV2Ref provider) create, + ) { + return ProviderOverride( + origin: this, + override: RestoreV2Provider._internal( + (ref) => create(ref as RestoreV2Ref), + from: from, + name: null, + dependencies: null, + allTransitiveDependencies: null, + debugGetCreateSourceHash: null, + backup: backup, + ), + ); + } + + @override + AutoDisposeProviderElement createElement() { + return _RestoreV2ProviderElement(this); + } + + @override + bool operator ==(Object other) { + return other is RestoreV2Provider && other.backup == backup; + } + + @override + int get hashCode { + var hash = _SystemHash.combine(0, runtimeType.hashCode); + hash = _SystemHash.combine(hash, backup.hashCode); + + return _SystemHash.finish(hash); + } +} + +@Deprecated('Will be removed in 3.0. Use Ref instead') +// ignore: unused_element +mixin RestoreV2Ref on AutoDisposeProviderRef { + /// The parameter `backup` of this provider. + Map get backup; +} + +class _RestoreV2ProviderElement extends AutoDisposeProviderElement + with RestoreV2Ref { + _RestoreV2ProviderElement(super.provider); + + @override + Map get backup => (origin as RestoreV2Provider).backup; +} // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/lib/modules/more/categories/categories_screen.dart b/lib/modules/more/categories/categories_screen.dart index 2e9785c..d354f52 100644 --- a/lib/modules/more/categories/categories_screen.dart +++ b/lib/modules/more/categories/categories_screen.dart @@ -5,6 +5,7 @@ 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/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/widgets/progress_center.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; @@ -19,9 +20,10 @@ class CategoriesScreen extends ConsumerStatefulWidget { class _CategoriesScreenState extends ConsumerState with TickerProviderStateMixin { late TabController _tabBarController; + int tabs = 3; @override void initState() { - _tabBarController = TabController(length: 3, vsync: this); + _tabBarController = TabController(length: tabs, vsync: this); _tabBarController.animateTo(widget.data.$2); super.initState(); @@ -29,10 +31,25 @@ class _CategoriesScreenState extends ConsumerState @override Widget build(BuildContext context) { + int newTabs = 0; + final hideManga = ref.watch(hideMangaStateProvider); + final hideAnime = ref.watch(hideAnimeStateProvider); + final hideNovel = ref.watch(hideNovelStateProvider); + if (!hideManga) newTabs++; + if (!hideAnime) newTabs++; + if (!hideNovel) newTabs++; + if (tabs != newTabs) { + _tabBarController.dispose(); + _tabBarController = TabController(length: newTabs, vsync: this); + _tabBarController.animateTo(0); + setState(() { + tabs = newTabs; + }); + } final l10n = l10nLocalizations(context)!; return DefaultTabController( animationDuration: Duration.zero, - length: 2, + length: newTabs, child: Scaffold( appBar: AppBar( elevation: 0, @@ -45,22 +62,25 @@ class _CategoriesScreenState extends ConsumerState indicatorSize: TabBarIndicatorSize.tab, controller: _tabBarController, tabs: [ - Tab(text: l10n.manga), - Tab(text: l10n.anime), - Tab(text: l10n.novel), + if (!hideManga) Tab(text: l10n.manga), + if (!hideAnime) Tab(text: l10n.anime), + if (!hideNovel) Tab(text: l10n.novel), ], ), ), - body: TabBarView(controller: _tabBarController, children: const [ - CategoriesTab( - itemType: ItemType.manga, - ), - CategoriesTab( - itemType: ItemType.anime, - ), - CategoriesTab( - itemType: ItemType.novel, - ) + body: TabBarView(controller: _tabBarController, children: [ + if (!hideManga) + CategoriesTab( + itemType: ItemType.manga, + ), + if (!hideAnime) + CategoriesTab( + itemType: ItemType.anime, + ), + if (!hideNovel) + CategoriesTab( + itemType: ItemType.novel, + ) ]), ), ); diff --git a/lib/modules/more/settings/player/player_screen.dart b/lib/modules/more/settings/player/player_screen.dart index 625eb6b..2da1666 100644 --- a/lib/modules/more/settings/player/player_screen.dart +++ b/lib/modules/more/settings/player/player_screen.dart @@ -1,6 +1,7 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/modules/more/settings/player/providers/player_state_provider.dart'; +import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; import 'package:numberpicker/numberpicker.dart'; @@ -20,6 +21,7 @@ class PlayerScreen extends ConsumerWidget { final enableAutoSkip = ref.watch(enableAutoSkipStateProvider); final aniSkipTimeoutLength = ref.watch(aniSkipTimeoutLengthStateProvider); final useLibass = ref.watch(useLibassStateProvider); + final hideAnime = ref.watch(hideAnimeStateProvider); final fullScreenPlayer = ref.watch(fullScreenPlayerStateProvider); return Scaffold( appBar: AppBar( @@ -28,6 +30,12 @@ class PlayerScreen extends ConsumerWidget { body: SingleChildScrollView( child: Column( children: [ + SwitchListTile( + value: hideAnime, + title: Text(context.l10n.hide_anime), + onChanged: (value) { + ref.read(hideAnimeStateProvider.notifier).set(value); + }), ListTile( onTap: () { final values = [100, 95, 90, 85, 80, 75, 70]; diff --git a/lib/modules/more/settings/reader/providers/reader_state_provider.dart b/lib/modules/more/settings/reader/providers/reader_state_provider.dart index 8f3dbcd..b89ac61 100644 --- a/lib/modules/more/settings/reader/providers/reader_state_provider.dart +++ b/lib/modules/more/settings/reader/providers/reader_state_provider.dart @@ -137,3 +137,48 @@ class FullScreenReaderState extends _$FullScreenReaderState { () => isar.settings.putSync(settings!..fullScreenReader = value)); } } + +@riverpod +class HideMangaState extends _$HideMangaState { + @override + bool build() { + return isar.settings.getSync(227)!.hideManga ?? false; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync(settings!..hideManga = value)); + } +} + +@riverpod +class HideAnimeState extends _$HideAnimeState { + @override + bool build() { + return isar.settings.getSync(227)!.hideAnime ?? false; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync(settings!..hideAnime = value)); + } +} + +@riverpod +class HideNovelState extends _$HideNovelState { + @override + bool build() { + return isar.settings.getSync(227)!.hideNovel ?? false; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync(settings!..hideNovel = value)); + } +} diff --git a/lib/modules/more/settings/reader/providers/reader_state_provider.g.dart b/lib/modules/more/settings/reader/providers/reader_state_provider.g.dart index f105f38..c4a0d23 100644 --- a/lib/modules/more/settings/reader/providers/reader_state_provider.g.dart +++ b/lib/modules/more/settings/reader/providers/reader_state_provider.g.dart @@ -157,5 +157,53 @@ final fullScreenReaderStateProvider = ); typedef _$FullScreenReaderState = AutoDisposeNotifier; +String _$hideMangaStateHash() => r'fd24207581798fd1634ff6df2c85b8895053d14c'; + +/// See also [HideMangaState]. +@ProviderFor(HideMangaState) +final hideMangaStateProvider = + AutoDisposeNotifierProvider.internal( + HideMangaState.new, + name: r'hideMangaStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$hideMangaStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$HideMangaState = AutoDisposeNotifier; +String _$hideAnimeStateHash() => r'3e8748d9312b9ea84364959b7de17fed2204d303'; + +/// See also [HideAnimeState]. +@ProviderFor(HideAnimeState) +final hideAnimeStateProvider = + AutoDisposeNotifierProvider.internal( + HideAnimeState.new, + name: r'hideAnimeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$hideAnimeStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$HideAnimeState = AutoDisposeNotifier; +String _$hideNovelStateHash() => r'697efab85819783a7c1982797927feb397770191'; + +/// See also [HideNovelState]. +@ProviderFor(HideNovelState) +final hideNovelStateProvider = + AutoDisposeNotifierProvider.internal( + HideNovelState.new, + name: r'hideNovelStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$hideNovelStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$HideNovelState = AutoDisposeNotifier; // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/lib/modules/more/settings/reader/reader_screen.dart b/lib/modules/more/settings/reader/reader_screen.dart index f7a1a6d..b96a196 100644 --- a/lib/modules/more/settings/reader/reader_screen.dart +++ b/lib/modules/more/settings/reader/reader_screen.dart @@ -20,6 +20,8 @@ class ReaderScreen extends ConsumerWidget { final backgroundColor = ref.watch(backgroundColorStateProvider); final usePageTapZones = ref.watch(usePageTapZonesStateProvider); final fullScreenReader = ref.watch(fullScreenReaderStateProvider); + final hideManga = ref.watch(hideMangaStateProvider); + final hideNovel = ref.watch(hideNovelStateProvider); final cropBorders = ref.watch(cropBordersStateProvider); return Scaffold( appBar: AppBar( @@ -328,6 +330,18 @@ class ReaderScreen extends ConsumerWidget { style: TextStyle(fontSize: 11, color: context.secondaryColor), ), ), + SwitchListTile( + value: hideManga, + title: Text(context.l10n.hide_manga), + onChanged: (value) { + ref.read(hideMangaStateProvider.notifier).set(value); + }), + SwitchListTile( + value: hideNovel, + title: Text(context.l10n.hide_novel), + onChanged: (value) { + ref.read(hideNovelStateProvider.notifier).set(value); + }), SwitchListTile( value: fullScreenReader, title: Text(context.l10n.fullscreen), diff --git a/lib/modules/updates/updates_screen.dart b/lib/modules/updates/updates_screen.dart index 2b7064e..a852407 100644 --- a/lib/modules/updates/updates_screen.dart +++ b/lib/modules/updates/updates_screen.dart @@ -11,6 +11,7 @@ import 'package:mangayomi/models/update.dart'; import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/modules/manga/detail/providers/update_manga_detail_providers.dart'; +import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; import 'package:mangayomi/modules/updates/widgets/update_chapter_list_tile_widget.dart'; import 'package:mangayomi/modules/history/providers/isar_providers.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; @@ -31,6 +32,7 @@ class _UpdatesScreenState extends ConsumerState with TickerProviderStateMixin { late TabController _tabBarController; bool _isLoading = false; + int tabs = 3; Future _updateLibrary() async { setState(() { _isLoading = true; @@ -70,16 +72,18 @@ class _UpdatesScreenState extends ConsumerState }); } + void tabListener() { + setState(() { + _textEditingController.clear(); + _isSearch = false; + }); + } + @override void initState() { - _tabBarController = TabController(length: 3, vsync: this); + _tabBarController = TabController(length: tabs, vsync: this); _tabBarController.animateTo(0); - _tabBarController.addListener(() { - setState(() { - _textEditingController.clear(); - _isSearch = false; - }); - }); + _tabBarController.addListener(tabListener); super.initState(); } @@ -88,10 +92,27 @@ class _UpdatesScreenState extends ConsumerState List entriesData = []; @override Widget build(BuildContext context) { + int newTabs = 0; + final hideManga = ref.watch(hideMangaStateProvider); + final hideAnime = ref.watch(hideAnimeStateProvider); + final hideNovel = ref.watch(hideNovelStateProvider); + if (!hideManga) newTabs++; + if (!hideAnime) newTabs++; + if (!hideNovel) newTabs++; + if (tabs != newTabs) { + _tabBarController.removeListener(tabListener); + _tabBarController.dispose(); + _tabBarController = TabController(length: newTabs, vsync: this); + _tabBarController.animateTo(0); + _tabBarController.addListener(tabListener); + setState(() { + tabs = newTabs; + }); + } final l10n = l10nLocalizations(context)!; return DefaultTabController( animationDuration: Duration.zero, - length: 2, + length: newTabs, child: Scaffold( appBar: AppBar( elevation: 0, @@ -166,10 +187,16 @@ class _UpdatesScreenState extends ConsumerState .idIsNotNull() .chapter((q) => q.manga((q) => q .itemTypeEqualTo(_tabBarController - .index == - 0 + .index == + 0 && + !hideManga ? ItemType.manga - : _tabBarController.index == 1 + : _tabBarController.index == + 1 - + (hideManga + ? 1 + : 0) && + !hideAnime ? ItemType.anime : ItemType.novel))) .findAllSync() @@ -197,27 +224,30 @@ class _UpdatesScreenState extends ConsumerState indicatorSize: TabBarIndicatorSize.tab, controller: _tabBarController, tabs: [ - Tab(text: l10n.manga), - Tab(text: l10n.anime), - Tab(text: l10n.novel), + if (!hideManga) Tab(text: l10n.manga), + if (!hideAnime) Tab(text: l10n.anime), + if (!hideNovel) Tab(text: l10n.novel), ], ), ), body: Padding( padding: const EdgeInsets.only(top: 10), child: TabBarView(controller: _tabBarController, children: [ - UpdateTab( - itemType: ItemType.manga, - query: _textEditingController.text, - isLoading: _isLoading), - UpdateTab( - itemType: ItemType.anime, - query: _textEditingController.text, - isLoading: _isLoading), - UpdateTab( - itemType: ItemType.novel, - query: _textEditingController.text, - isLoading: _isLoading) + if (!hideManga) + UpdateTab( + itemType: ItemType.manga, + query: _textEditingController.text, + isLoading: _isLoading), + if (!hideAnime) + UpdateTab( + itemType: ItemType.anime, + query: _textEditingController.text, + isLoading: _isLoading), + if (!hideNovel) + UpdateTab( + itemType: ItemType.novel, + query: _textEditingController.text, + isLoading: _isLoading) ]), ), ), diff --git a/lib/services/sync_server.dart b/lib/services/sync_server.dart index 0078c4a..d2b3821 100644 --- a/lib/services/sync_server.dart +++ b/lib/services/sync_server.dart @@ -11,6 +11,7 @@ import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/models/settings.dart'; import 'package:mangayomi/models/source.dart'; +import 'package:mangayomi/modules/more/backup_and_restore/providers/restore.dart'; import 'package:mangayomi/modules/more/settings/sync/models/jwt.dart'; import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart'; import 'package:mangayomi/modules/more/settings/appearance/providers/blend_level_state_provider.dart'; @@ -195,113 +196,9 @@ class SyncServer extends _$SyncServer { void _restore(Map backup) { if (backup['version'] == "1") { - try { - final manga = - (backup["manga"] as List?)?.map((e) => Manga.fromJson(e)).toList(); - final chapters = (backup["chapters"] as List?) - ?.map((e) => Chapter.fromJson(e)) - .toList(); - final categories = (backup["categories"] as List?) - ?.map((e) => Category.fromJson(e)) - .toList(); - final track = - (backup["tracks"] as List?)?.map((e) => Track.fromJson(e)).toList(); - final history = (backup["history"] as List?) - ?.map((e) => History.fromJson(e)) - .toList(); - final settings = (backup["settings"] as List?) - ?.map((e) => Settings.fromJson(e)) - .toList(); - final extensions = (backup["extensions"] as List?) - ?.map((e) => Source.fromJson(e)) - .toList(); - final extensionsPref = (backup["extensions_preferences"] as List?) - ?.map((e) => SourcePreference.fromJson(e)) - .toList(); - final updates = (backup["updates"] as List?) - ?.map((e) => Update.fromJson(e)) - .toList(); - - isar.writeTxnSync(() { - isar.mangas.clearSync(); - if (manga != null) { - isar.mangas.putAllSync(manga); - if (chapters != null) { - isar.chapters.clearSync(); - for (var chapter in chapters) { - final manga = isar.mangas.getSync(chapter.mangaId!); - if (manga != null) { - isar.chapters.putSync(chapter..manga.value = manga); - chapter.manga.saveSync(); - } - } - - isar.historys.clearSync(); - if (history != null) { - for (var element in history) { - final chapter = isar.chapters.getSync(element.chapterId!); - if (chapter != null) { - isar.historys.putSync(element..chapter.value = chapter); - element.chapter.saveSync(); - } - } - } - - isar.updates.clearSync(); - if (updates != null) { - final tempChapters = - isar.chapters.filter().idIsNotNull().findAllSync().toList(); - for (var update in updates) { - final matchingChapter = tempChapters - .where((chapter) => - chapter.mangaId == update.mangaId && - chapter.name == update.chapterName) - .firstOrNull; - if (matchingChapter != null) { - isar.updates - .putSync(update..chapter.value = matchingChapter); - update.chapter.saveSync(); - } - } - } - } - - isar.categorys.clearSync(); - if (categories != null) { - isar.categorys.putAllSync(categories); - } - } - - isar.tracks.clearSync(); - if (track != null) { - isar.tracks.putAllSync(track); - } - - isar.sources.clearSync(); - if (extensions != null) { - isar.sources.putAllSync(extensions); - } - - isar.sourcePreferences.clearSync(); - if (extensionsPref != null) { - isar.sourcePreferences.putAllSync(extensionsPref); - } - isar.settings.clearSync(); - if (settings != null) { - isar.settings.putAllSync(settings); - } - if (isar.settings.getSync(227) == null) { - isar.settings.putSync(Settings(id: 227)); - } - ref.invalidate(themeModeStateProvider); - ref.invalidate(blendLevelStateProvider); - ref.invalidate(flexSchemeColorStateProvider); - ref.invalidate(pureBlackDarkModeStateProvider); - ref.invalidate(l10nLocaleStateProvider); - }); - } catch (e) { - botToast(e.toString(), second: 5); - } + ref.watch(restoreV1Provider(backup)); + } else if (backup['version'] == "2") { + ref.watch(restoreV2Provider(backup)); } } diff --git a/lib/services/sync_server.g.dart b/lib/services/sync_server.g.dart index 7efca60..daf4b7a 100644 --- a/lib/services/sync_server.g.dart +++ b/lib/services/sync_server.g.dart @@ -6,7 +6,7 @@ part of 'sync_server.dart'; // RiverpodGenerator // ************************************************************************** -String _$syncServerHash() => r'db0f27093c2e76d4158b7af7960359c54c9a00b2'; +String _$syncServerHash() => r'4ef01cd50d1ec4eaecd971fe2f176d2650147df8'; /// Copied from Dart SDK class _SystemHash { From 80a8feee33da2323f8e7aa95f68061c8bb0413e3 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sun, 22 Dec 2024 20:47:11 +0100 Subject: [PATCH 17/18] small fix --- lib/models/category.dart | 4 ++-- lib/models/history.dart | 4 ++-- lib/models/manga.dart | 2 +- lib/models/source.dart | 2 +- 4 files changed, 6 insertions(+), 6 deletions(-) diff --git a/lib/models/category.dart b/lib/models/category.dart index 551bcc6..4d4d05c 100644 --- a/lib/models/category.dart +++ b/lib/models/category.dart @@ -19,7 +19,7 @@ class Category { Category.fromJson(Map json) { id = json['id']; name = json['name']; - forItemType = json['forItemType']; + forItemType = ItemType.values[json['forItemType'] ?? 0]; } Category.fromJsonV1(Map json) { @@ -33,5 +33,5 @@ class Category { } Map toJson() => - {'id': id, 'name': name, 'forItemType': forItemType}; + {'id': id, 'name': name, 'forItemType': forItemType.index}; } diff --git a/lib/models/history.dart b/lib/models/history.dart index 367b353..802dcd9 100644 --- a/lib/models/history.dart +++ b/lib/models/history.dart @@ -34,7 +34,7 @@ class History { chapterId = json['chapterId']; date = json['date']; id = json['id']; - itemType = json['itemType']; + itemType = ItemType.values[json['itemType'] ?? 0]; mangaId = json['mangaId']; } @@ -54,7 +54,7 @@ class History { 'chapterId': chapterId, 'date': date, 'id': id, - 'itemType': itemType, + 'itemType': itemType.index, 'mangaId': mangaId }; } diff --git a/lib/models/manga.dart b/lib/models/manga.dart index da21256..4473cab 100644 --- a/lib/models/manga.dart +++ b/lib/models/manga.dart @@ -87,7 +87,7 @@ class Manga { id = json['id']; imageUrl = json['imageUrl']; isLocalArchive = json['isLocalArchive']; - itemType = ItemType.values[json['itemType']]; + itemType = ItemType.values[json['itemType'] ?? 0]; lang = json['lang']; lastRead = json['lastRead']; lastUpdate = json['lastUpdate']; diff --git a/lib/models/source.dart b/lib/models/source.dart index 9f3e812..e6c0f42 100644 --- a/lib/models/source.dart +++ b/lib/models/source.dart @@ -171,7 +171,7 @@ class Source { 'isAdded': isAdded, 'isFullData': isFullData, 'isManga': isManga, - 'itemType': itemType, + 'itemType': itemType.index, 'isNsfw': isNsfw, 'isPinned': isPinned, 'lang': lang, From 772b14d8750a51c94c9175d835948b1798ffc96d Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 23 Dec 2024 00:19:19 +0100 Subject: [PATCH 18/18] new backup version --- lib/services/sync_server.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/services/sync_server.dart b/lib/services/sync_server.dart index d2b3821..7be9826 100644 --- a/lib/services/sync_server.dart +++ b/lib/services/sync_server.dart @@ -122,7 +122,7 @@ class SyncServer extends _$SyncServer { Map _getData() { Map datas = {}; - datas.addAll({"version": "1"}); + datas.addAll({"version": "2"}); final mangas = isar.mangas .filter() .idIsNotNull()