diff --git a/lib/models/settings.dart b/lib/models/settings.dart index 0109af96..a3756472 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -65,6 +65,14 @@ class Settings { List? personalReaderModeList; + bool? animatePageTransitions; + + int? doubleTapAnimationSpeed; + + bool? showNSFW; + + bool? onlyIncludePinnedSources; + Settings( {this.id = 227, this.displayType = DisplayType.compactGrid, @@ -92,7 +100,11 @@ class Settings { this.userAgent = defaultUserAgent, this.cookiesList, this.defaultReaderMode = ReaderMode.vertical, - this.personalReaderModeList}); + this.personalReaderModeList, + this.animatePageTransitions = true, + this.doubleTapAnimationSpeed = 1, + this.showNSFW = true, + this.onlyIncludePinnedSources = false}); } enum DisplayType { diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index c090d7b1..7a0e305d 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -17,154 +17,174 @@ const SettingsSchema = CollectionSchema( name: r'Settings', id: -8656046621518759136, properties: { - r'chapterFilterBookmarkedList': PropertySchema( + r'animatePageTransitions': PropertySchema( id: 0, + name: r'animatePageTransitions', + type: IsarType.bool, + ), + r'chapterFilterBookmarkedList': PropertySchema( + id: 1, name: r'chapterFilterBookmarkedList', type: IsarType.objectList, target: r'ChapterFilterBookmarked', ), r'chapterFilterDownloadedList': PropertySchema( - id: 1, + id: 2, name: r'chapterFilterDownloadedList', type: IsarType.objectList, target: r'ChapterFilterDownloaded', ), r'chapterFilterUnreadList': PropertySchema( - id: 2, + id: 3, name: r'chapterFilterUnreadList', type: IsarType.objectList, target: r'ChapterFilterUnread', ), r'chapterPageIndexList': PropertySchema( - id: 3, + id: 4, name: r'chapterPageIndexList', type: IsarType.objectList, target: r'ChapterPageIndex', ), r'chapterPageUrlsList': PropertySchema( - id: 4, + id: 5, name: r'chapterPageUrlsList', type: IsarType.objectList, target: r'ChapterPageurls', ), r'cookiesList': PropertySchema( - id: 5, + id: 6, name: r'cookiesList', type: IsarType.objectList, target: r'Cookie', ), r'dateFormat': PropertySchema( - id: 6, + id: 7, name: r'dateFormat', type: IsarType.string, ), r'defaultReaderMode': PropertySchema( - id: 7, + id: 8, name: r'defaultReaderMode', type: IsarType.byte, enumMap: _SettingsdefaultReaderModeEnumValueMap, ), r'displayType': PropertySchema( - id: 8, + id: 9, name: r'displayType', type: IsarType.byte, enumMap: _SettingsdisplayTypeEnumValueMap, ), + r'doubleTapAnimationSpeed': PropertySchema( + id: 10, + name: r'doubleTapAnimationSpeed', + type: IsarType.long, + ), r'flexColorSchemeBlendLevel': PropertySchema( - id: 9, + id: 11, name: r'flexColorSchemeBlendLevel', type: IsarType.double, ), r'flexSchemeColorIndex': PropertySchema( - id: 10, + id: 12, name: r'flexSchemeColorIndex', type: IsarType.long, ), r'incognitoMode': PropertySchema( - id: 11, + id: 13, name: r'incognitoMode', type: IsarType.bool, ), r'libraryDownloadedChapters': PropertySchema( - id: 12, + id: 14, name: r'libraryDownloadedChapters', type: IsarType.bool, ), r'libraryFilterMangasBookMarkedType': PropertySchema( - id: 13, + id: 15, name: r'libraryFilterMangasBookMarkedType', type: IsarType.long, ), r'libraryFilterMangasDownloadType': PropertySchema( - id: 14, + id: 16, name: r'libraryFilterMangasDownloadType', type: IsarType.long, ), r'libraryFilterMangasStartedType': PropertySchema( - id: 15, + id: 17, name: r'libraryFilterMangasStartedType', type: IsarType.long, ), r'libraryFilterMangasUnreadType': PropertySchema( - id: 16, + id: 18, name: r'libraryFilterMangasUnreadType', type: IsarType.long, ), r'libraryShowCategoryTabs': PropertySchema( - id: 17, + id: 19, name: r'libraryShowCategoryTabs', type: IsarType.bool, ), r'libraryShowContinueReadingButton': PropertySchema( - id: 18, + id: 20, name: r'libraryShowContinueReadingButton', type: IsarType.bool, ), r'libraryShowLanguage': PropertySchema( - id: 19, + id: 21, name: r'libraryShowLanguage', type: IsarType.bool, ), r'libraryShowNumbersOfItems': PropertySchema( - id: 20, + id: 22, name: r'libraryShowNumbersOfItems', type: IsarType.bool, ), + r'onlyIncludePinnedSources': PropertySchema( + id: 23, + name: r'onlyIncludePinnedSources', + type: IsarType.bool, + ), r'personalReaderModeList': PropertySchema( - id: 21, + id: 24, name: r'personalReaderModeList', type: IsarType.objectList, target: r'PersonalReaderMode', ), r'relativeTimesTamps': PropertySchema( - id: 22, + id: 25, name: r'relativeTimesTamps', type: IsarType.long, ), + r'showNSFW': PropertySchema( + id: 26, + name: r'showNSFW', + type: IsarType.bool, + ), r'showPagesNumber': PropertySchema( - id: 23, + id: 27, name: r'showPagesNumber', type: IsarType.bool, ), r'sortChapterList': PropertySchema( - id: 24, + id: 28, name: r'sortChapterList', type: IsarType.objectList, target: r'SortChapter', ), r'sortLibraryManga': PropertySchema( - id: 25, + id: 29, name: r'sortLibraryManga', type: IsarType.object, target: r'SortLibraryManga', ), r'themeIsDark': PropertySchema( - id: 26, + id: 30, name: r'themeIsDark', type: IsarType.bool, ), r'userAgent': PropertySchema( - id: 27, + id: 31, name: r'userAgent', type: IsarType.string, ) @@ -339,79 +359,83 @@ void _settingsSerialize( List offsets, Map> allOffsets, ) { + writer.writeBool(offsets[0], object.animatePageTransitions); writer.writeObjectList( - offsets[0], + offsets[1], allOffsets, ChapterFilterBookmarkedSchema.serialize, object.chapterFilterBookmarkedList, ); writer.writeObjectList( - offsets[1], + offsets[2], allOffsets, ChapterFilterDownloadedSchema.serialize, object.chapterFilterDownloadedList, ); writer.writeObjectList( - offsets[2], + offsets[3], allOffsets, ChapterFilterUnreadSchema.serialize, object.chapterFilterUnreadList, ); writer.writeObjectList( - offsets[3], + offsets[4], allOffsets, ChapterPageIndexSchema.serialize, object.chapterPageIndexList, ); writer.writeObjectList( - offsets[4], + offsets[5], allOffsets, ChapterPageurlsSchema.serialize, object.chapterPageUrlsList, ); writer.writeObjectList( - offsets[5], + offsets[6], allOffsets, CookieSchema.serialize, object.cookiesList, ); - writer.writeString(offsets[6], object.dateFormat); - writer.writeByte(offsets[7], object.defaultReaderMode.index); - writer.writeByte(offsets[8], object.displayType.index); - writer.writeDouble(offsets[9], object.flexColorSchemeBlendLevel); - writer.writeLong(offsets[10], object.flexSchemeColorIndex); - writer.writeBool(offsets[11], object.incognitoMode); - writer.writeBool(offsets[12], object.libraryDownloadedChapters); - writer.writeLong(offsets[13], object.libraryFilterMangasBookMarkedType); - writer.writeLong(offsets[14], object.libraryFilterMangasDownloadType); - writer.writeLong(offsets[15], object.libraryFilterMangasStartedType); - writer.writeLong(offsets[16], object.libraryFilterMangasUnreadType); - writer.writeBool(offsets[17], object.libraryShowCategoryTabs); - writer.writeBool(offsets[18], object.libraryShowContinueReadingButton); - writer.writeBool(offsets[19], object.libraryShowLanguage); - writer.writeBool(offsets[20], object.libraryShowNumbersOfItems); + writer.writeString(offsets[7], object.dateFormat); + writer.writeByte(offsets[8], object.defaultReaderMode.index); + writer.writeByte(offsets[9], object.displayType.index); + writer.writeLong(offsets[10], object.doubleTapAnimationSpeed); + writer.writeDouble(offsets[11], object.flexColorSchemeBlendLevel); + writer.writeLong(offsets[12], object.flexSchemeColorIndex); + writer.writeBool(offsets[13], object.incognitoMode); + writer.writeBool(offsets[14], object.libraryDownloadedChapters); + writer.writeLong(offsets[15], object.libraryFilterMangasBookMarkedType); + writer.writeLong(offsets[16], object.libraryFilterMangasDownloadType); + writer.writeLong(offsets[17], object.libraryFilterMangasStartedType); + writer.writeLong(offsets[18], object.libraryFilterMangasUnreadType); + writer.writeBool(offsets[19], object.libraryShowCategoryTabs); + writer.writeBool(offsets[20], object.libraryShowContinueReadingButton); + writer.writeBool(offsets[21], object.libraryShowLanguage); + writer.writeBool(offsets[22], object.libraryShowNumbersOfItems); + writer.writeBool(offsets[23], object.onlyIncludePinnedSources); writer.writeObjectList( - offsets[21], + offsets[24], allOffsets, PersonalReaderModeSchema.serialize, object.personalReaderModeList, ); - writer.writeLong(offsets[22], object.relativeTimesTamps); - writer.writeBool(offsets[23], object.showPagesNumber); + writer.writeLong(offsets[25], object.relativeTimesTamps); + writer.writeBool(offsets[26], object.showNSFW); + writer.writeBool(offsets[27], object.showPagesNumber); writer.writeObjectList( - offsets[24], + offsets[28], allOffsets, SortChapterSchema.serialize, object.sortChapterList, ); writer.writeObject( - offsets[25], + offsets[29], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryManga, ); - writer.writeBool(offsets[26], object.themeIsDark); - writer.writeString(offsets[27], object.userAgent); + writer.writeBool(offsets[30], object.themeIsDark); + writer.writeString(offsets[31], object.userAgent); } Settings _settingsDeserialize( @@ -421,81 +445,85 @@ Settings _settingsDeserialize( Map> allOffsets, ) { final object = Settings( + animatePageTransitions: reader.readBoolOrNull(offsets[0]), chapterFilterDownloadedList: reader.readObjectList( - offsets[1], + offsets[2], ChapterFilterDownloadedSchema.deserialize, allOffsets, ChapterFilterDownloaded(), ), chapterPageIndexList: reader.readObjectList( - offsets[3], + offsets[4], ChapterPageIndexSchema.deserialize, allOffsets, ChapterPageIndex(), ), chapterPageUrlsList: reader.readObjectList( - offsets[4], + offsets[5], ChapterPageurlsSchema.deserialize, allOffsets, ChapterPageurls(), ), cookiesList: reader.readObjectList( - offsets[5], + offsets[6], CookieSchema.deserialize, allOffsets, Cookie(), ), - dateFormat: reader.readStringOrNull(offsets[6]), + dateFormat: reader.readStringOrNull(offsets[7]), defaultReaderMode: _SettingsdefaultReaderModeValueEnumMap[ - reader.readByteOrNull(offsets[7])] ?? + reader.readByteOrNull(offsets[8])] ?? ReaderMode.vertical, displayType: - _SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offsets[8])] ?? + _SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offsets[9])] ?? DisplayType.compactGrid, - flexColorSchemeBlendLevel: reader.readDoubleOrNull(offsets[9]), - flexSchemeColorIndex: reader.readLongOrNull(offsets[10]), + doubleTapAnimationSpeed: reader.readLongOrNull(offsets[10]), + flexColorSchemeBlendLevel: reader.readDoubleOrNull(offsets[11]), + flexSchemeColorIndex: reader.readLongOrNull(offsets[12]), id: id, - incognitoMode: reader.readBoolOrNull(offsets[11]), - libraryDownloadedChapters: reader.readBoolOrNull(offsets[12]), - libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[13]), - libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[14]), - libraryFilterMangasStartedType: reader.readLongOrNull(offsets[15]), - libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[16]), - libraryShowCategoryTabs: reader.readBoolOrNull(offsets[17]), - libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[18]), - libraryShowLanguage: reader.readBoolOrNull(offsets[19]), - libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[20]), + incognitoMode: reader.readBoolOrNull(offsets[13]), + libraryDownloadedChapters: reader.readBoolOrNull(offsets[14]), + libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[15]), + libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[16]), + libraryFilterMangasStartedType: reader.readLongOrNull(offsets[17]), + libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[18]), + libraryShowCategoryTabs: reader.readBoolOrNull(offsets[19]), + libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[20]), + libraryShowLanguage: reader.readBoolOrNull(offsets[21]), + libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[22]), + onlyIncludePinnedSources: reader.readBoolOrNull(offsets[23]), personalReaderModeList: reader.readObjectList( - offsets[21], + offsets[24], PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), ), - relativeTimesTamps: reader.readLongOrNull(offsets[22]), - showPagesNumber: reader.readBoolOrNull(offsets[23]), + relativeTimesTamps: reader.readLongOrNull(offsets[25]), + showNSFW: reader.readBoolOrNull(offsets[26]), + showPagesNumber: reader.readBoolOrNull(offsets[27]), sortChapterList: reader.readObjectList( - offsets[24], + offsets[28], SortChapterSchema.deserialize, allOffsets, SortChapter(), ), sortLibraryManga: reader.readObjectOrNull( - offsets[25], + offsets[29], SortLibraryMangaSchema.deserialize, allOffsets, ), - themeIsDark: reader.readBoolOrNull(offsets[26]), - userAgent: reader.readStringOrNull(offsets[27]), + themeIsDark: reader.readBoolOrNull(offsets[30]), + userAgent: reader.readStringOrNull(offsets[31]), ); object.chapterFilterBookmarkedList = reader.readObjectList( - offsets[0], + offsets[1], ChapterFilterBookmarkedSchema.deserialize, allOffsets, ChapterFilterBookmarked(), ); object.chapterFilterUnreadList = reader.readObjectList( - offsets[2], + offsets[3], ChapterFilterUnreadSchema.deserialize, allOffsets, ChapterFilterUnread(), @@ -511,107 +539,115 @@ P _settingsDeserializeProp

( ) { switch (propertyId) { case 0: + return (reader.readBoolOrNull(offset)) as P; + case 1: return (reader.readObjectList( offset, ChapterFilterBookmarkedSchema.deserialize, allOffsets, ChapterFilterBookmarked(), )) as P; - case 1: + case 2: return (reader.readObjectList( offset, ChapterFilterDownloadedSchema.deserialize, allOffsets, ChapterFilterDownloaded(), )) as P; - case 2: + case 3: return (reader.readObjectList( offset, ChapterFilterUnreadSchema.deserialize, allOffsets, ChapterFilterUnread(), )) as P; - case 3: + case 4: return (reader.readObjectList( offset, ChapterPageIndexSchema.deserialize, allOffsets, ChapterPageIndex(), )) as P; - case 4: + case 5: return (reader.readObjectList( offset, ChapterPageurlsSchema.deserialize, allOffsets, ChapterPageurls(), )) as P; - case 5: + case 6: return (reader.readObjectList( offset, CookieSchema.deserialize, allOffsets, Cookie(), )) as P; - case 6: - return (reader.readStringOrNull(offset)) as P; case 7: + return (reader.readStringOrNull(offset)) as P; + case 8: return (_SettingsdefaultReaderModeValueEnumMap[ reader.readByteOrNull(offset)] ?? ReaderMode.vertical) as P; - case 8: + case 9: return (_SettingsdisplayTypeValueEnumMap[reader.readByteOrNull(offset)] ?? DisplayType.compactGrid) as P; - case 9: - return (reader.readDoubleOrNull(offset)) as P; case 10: return (reader.readLongOrNull(offset)) as P; case 11: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readDoubleOrNull(offset)) as P; case 12: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 13: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 14: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 15: return (reader.readLongOrNull(offset)) as P; case 16: return (reader.readLongOrNull(offset)) as P; case 17: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 18: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 19: return (reader.readBoolOrNull(offset)) as P; case 20: return (reader.readBoolOrNull(offset)) as P; case 21: + return (reader.readBoolOrNull(offset)) as P; + case 22: + return (reader.readBoolOrNull(offset)) as P; + case 23: + return (reader.readBoolOrNull(offset)) as P; + case 24: return (reader.readObjectList( offset, PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), )) as P; - case 22: + case 25: return (reader.readLongOrNull(offset)) as P; - case 23: + case 26: return (reader.readBoolOrNull(offset)) as P; - case 24: + case 27: + return (reader.readBoolOrNull(offset)) as P; + case 28: return (reader.readObjectList( offset, SortChapterSchema.deserialize, allOffsets, SortChapter(), )) as P; - case 25: + case 29: return (reader.readObjectOrNull( offset, SortLibraryMangaSchema.deserialize, allOffsets, )) as P; - case 26: + case 30: return (reader.readBoolOrNull(offset)) as P; - case 27: + case 31: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -734,6 +770,34 @@ extension SettingsQueryWhere on QueryBuilder { extension SettingsQueryFilter on QueryBuilder { + QueryBuilder + animatePageTransitionsIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'animatePageTransitions', + )); + }); + } + + QueryBuilder + animatePageTransitionsIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'animatePageTransitions', + )); + }); + } + + QueryBuilder + animatePageTransitionsEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'animatePageTransitions', + value: value, + )); + }); + } + QueryBuilder chapterFilterBookmarkedListIsNull() { return QueryBuilder.apply(this, (query) { @@ -1632,6 +1696,80 @@ extension SettingsQueryFilter }); } + QueryBuilder + doubleTapAnimationSpeedIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'doubleTapAnimationSpeed', + )); + }); + } + + QueryBuilder + doubleTapAnimationSpeedIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'doubleTapAnimationSpeed', + )); + }); + } + + QueryBuilder + doubleTapAnimationSpeedEqualTo(int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'doubleTapAnimationSpeed', + value: value, + )); + }); + } + + QueryBuilder + doubleTapAnimationSpeedGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'doubleTapAnimationSpeed', + value: value, + )); + }); + } + + QueryBuilder + doubleTapAnimationSpeedLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'doubleTapAnimationSpeed', + value: value, + )); + }); + } + + QueryBuilder + doubleTapAnimationSpeedBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'doubleTapAnimationSpeed', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder flexColorSchemeBlendLevelIsNull() { return QueryBuilder.apply(this, (query) { @@ -2322,6 +2460,34 @@ extension SettingsQueryFilter }); } + QueryBuilder + onlyIncludePinnedSourcesIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'onlyIncludePinnedSources', + )); + }); + } + + QueryBuilder + onlyIncludePinnedSourcesIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'onlyIncludePinnedSources', + )); + }); + } + + QueryBuilder + onlyIncludePinnedSourcesEqualTo(bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'onlyIncludePinnedSources', + value: value, + )); + }); + } + QueryBuilder personalReaderModeListIsNull() { return QueryBuilder.apply(this, (query) { @@ -2503,6 +2669,32 @@ extension SettingsQueryFilter }); } + QueryBuilder showNSFWIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'showNSFW', + )); + }); + } + + QueryBuilder showNSFWIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'showNSFW', + )); + }); + } + + QueryBuilder showNSFWEqualTo( + bool? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'showNSFW', + value: value, + )); + }); + } + QueryBuilder showPagesNumberIsNull() { return QueryBuilder.apply(this, (query) { @@ -2903,6 +3095,20 @@ extension SettingsQueryLinks on QueryBuilder {} extension SettingsQuerySortBy on QueryBuilder { + QueryBuilder + sortByAnimatePageTransitions() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'animatePageTransitions', Sort.asc); + }); + } + + QueryBuilder + sortByAnimatePageTransitionsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'animatePageTransitions', Sort.desc); + }); + } + QueryBuilder sortByDateFormat() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'dateFormat', Sort.asc); @@ -2939,6 +3145,20 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder + sortByDoubleTapAnimationSpeed() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'doubleTapAnimationSpeed', Sort.asc); + }); + } + + QueryBuilder + sortByDoubleTapAnimationSpeedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'doubleTapAnimationSpeed', Sort.desc); + }); + } + QueryBuilder sortByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -3103,6 +3323,20 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder + sortByOnlyIncludePinnedSources() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'onlyIncludePinnedSources', Sort.asc); + }); + } + + QueryBuilder + sortByOnlyIncludePinnedSourcesDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'onlyIncludePinnedSources', Sort.desc); + }); + } + QueryBuilder sortByRelativeTimesTamps() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'relativeTimesTamps', Sort.asc); @@ -3116,6 +3350,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByShowNSFW() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'showNSFW', Sort.asc); + }); + } + + QueryBuilder sortByShowNSFWDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'showNSFW', Sort.desc); + }); + } + QueryBuilder sortByShowPagesNumber() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'showPagesNumber', Sort.asc); @@ -3155,6 +3401,20 @@ extension SettingsQuerySortBy on QueryBuilder { extension SettingsQuerySortThenBy on QueryBuilder { + QueryBuilder + thenByAnimatePageTransitions() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'animatePageTransitions', Sort.asc); + }); + } + + QueryBuilder + thenByAnimatePageTransitionsDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'animatePageTransitions', Sort.desc); + }); + } + QueryBuilder thenByDateFormat() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'dateFormat', Sort.asc); @@ -3191,6 +3451,20 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder + thenByDoubleTapAnimationSpeed() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'doubleTapAnimationSpeed', Sort.asc); + }); + } + + QueryBuilder + thenByDoubleTapAnimationSpeedDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'doubleTapAnimationSpeed', Sort.desc); + }); + } + QueryBuilder thenByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -3367,6 +3641,20 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder + thenByOnlyIncludePinnedSources() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'onlyIncludePinnedSources', Sort.asc); + }); + } + + QueryBuilder + thenByOnlyIncludePinnedSourcesDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'onlyIncludePinnedSources', Sort.desc); + }); + } + QueryBuilder thenByRelativeTimesTamps() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'relativeTimesTamps', Sort.asc); @@ -3380,6 +3668,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByShowNSFW() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'showNSFW', Sort.asc); + }); + } + + QueryBuilder thenByShowNSFWDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'showNSFW', Sort.desc); + }); + } + QueryBuilder thenByShowPagesNumber() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'showPagesNumber', Sort.asc); @@ -3419,6 +3719,13 @@ extension SettingsQuerySortThenBy extension SettingsQueryWhereDistinct on QueryBuilder { + QueryBuilder + distinctByAnimatePageTransitions() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'animatePageTransitions'); + }); + } + QueryBuilder distinctByDateFormat( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -3438,6 +3745,13 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder + distinctByDoubleTapAnimationSpeed() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'doubleTapAnimationSpeed'); + }); + } + QueryBuilder distinctByFlexColorSchemeBlendLevel() { return QueryBuilder.apply(this, (query) { @@ -3519,12 +3833,25 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder + distinctByOnlyIncludePinnedSources() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'onlyIncludePinnedSources'); + }); + } + QueryBuilder distinctByRelativeTimesTamps() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'relativeTimesTamps'); }); } + QueryBuilder distinctByShowNSFW() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'showNSFW'); + }); + } + QueryBuilder distinctByShowPagesNumber() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'showPagesNumber'); @@ -3553,6 +3880,13 @@ extension SettingsQueryProperty }); } + QueryBuilder + animatePageTransitionsProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'animatePageTransitions'); + }); + } + QueryBuilder?, QQueryOperations> chapterFilterBookmarkedListProperty() { return QueryBuilder.apply(this, (query) { @@ -3614,6 +3948,13 @@ extension SettingsQueryProperty }); } + QueryBuilder + doubleTapAnimationSpeedProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'doubleTapAnimationSpeed'); + }); + } + QueryBuilder flexColorSchemeBlendLevelProperty() { return QueryBuilder.apply(this, (query) { @@ -3697,6 +4038,13 @@ extension SettingsQueryProperty }); } + QueryBuilder + onlyIncludePinnedSourcesProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'onlyIncludePinnedSources'); + }); + } + QueryBuilder?, QQueryOperations> personalReaderModeListProperty() { return QueryBuilder.apply(this, (query) { @@ -3710,6 +4058,12 @@ extension SettingsQueryProperty }); } + QueryBuilder showNSFWProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'showNSFW'); + }); + } + QueryBuilder showPagesNumberProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'showPagesNumber'); diff --git a/lib/router/router.dart b/lib/router/router.dart index 09a064fe..61f9abf3 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -7,7 +7,7 @@ import 'package:mangayomi/services/webviews/webview.dart'; import 'package:mangayomi/views/browse/browse_screen.dart'; import 'package:mangayomi/views/browse/extension/extension_lang.dart'; import 'package:mangayomi/views/browse/global_search_screen.dart'; -import 'package:mangayomi/views/general/general_screen.dart'; +import 'package:mangayomi/views/main_view/main_screen.dart'; import 'package:mangayomi/views/history/history_screen.dart'; import 'package:mangayomi/views/library/library_screen.dart'; import 'package:mangayomi/views/manga/detail/manga_detail_main.dart'; @@ -18,7 +18,10 @@ import 'package:mangayomi/views/more/about_screen.dart'; import 'package:mangayomi/views/more/download_queue/download_queue_screen.dart'; import 'package:mangayomi/views/more/more_screen.dart'; import 'package:mangayomi/views/more/settings/appearance/appearance_screen.dart'; -import 'package:mangayomi/views/more/settings/categoties/categories_screen.dart'; +import 'package:mangayomi/views/more/categoties/categories_screen.dart'; +import 'package:mangayomi/views/more/settings/browse/browse_screen.dart'; +import 'package:mangayomi/views/more/settings/general/general_screen.dart'; +import 'package:mangayomi/views/more/settings/reader/reader_screen.dart'; import 'package:mangayomi/views/more/settings/settings_screen.dart'; import 'package:mangayomi/views/updates/updates_screen.dart'; @@ -36,7 +39,7 @@ final routerProvider = Provider((ref) { class AsyncRouterNotifier extends ChangeNotifier { List get _routes => [ ShellRoute( - builder: (context, state, child) => GeneralScreen(child: child), + builder: (context, state, child) => MainScreen(child: child), routes: [ GoRoute( name: "library", @@ -276,6 +279,45 @@ class AsyncRouterNotifier extends ChangeNotifier { ); }, ), + GoRoute( + path: "/general", + name: "general", + builder: (context, state) { + return const GeneralScreen(); + }, + pageBuilder: (context, state) { + return CustomTransition( + key: state.pageKey, + child: const GeneralScreen(), + ); + }, + ), + GoRoute( + path: "/readerMode", + name: "readerMode", + builder: (context, state) { + return const ReaderScreen(); + }, + pageBuilder: (context, state) { + return CustomTransition( + key: state.pageKey, + child: const ReaderScreen(), + ); + }, + ), + GoRoute( + path: "/browseS", + name: "browseS", + builder: (context, state) { + return const BrowseSScreen(); + }, + pageBuilder: (context, state) { + return CustomTransition( + key: state.pageKey, + child: const BrowseSScreen(), + ); + }, + ), ]; } diff --git a/lib/services/get_chapter_url.dart b/lib/services/get_chapter_url.dart index d32c7959..48f014e0 100644 --- a/lib/services/get_chapter_url.dart +++ b/lib/services/get_chapter_url.dart @@ -15,7 +15,7 @@ import 'package:mangayomi/sources/multisrc/mangathemesia/src/mangathemesia.dart' import 'package:mangayomi/sources/multisrc/mmrcms/src/mmrcms.dart'; import 'package:mangayomi/sources/utils/utils.dart'; import 'package:mangayomi/utils/reg_exp_matcher.dart'; -import 'package:mangayomi/views/more/settings/providers/incognito_mode_state_provider.dart'; +import 'package:mangayomi/views/more/providers/incognito_mode_state_provider.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'get_chapter_url.g.dart'; diff --git a/lib/views/browse/extension/extension_screen.dart b/lib/views/browse/extension/extension_screen.dart index dd3b0e9a..e2d87368 100644 --- a/lib/views/browse/extension/extension_screen.dart +++ b/lib/views/browse/extension/extension_screen.dart @@ -1,5 +1,3 @@ -import 'dart:io'; - import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:grouped_list/grouped_list.dart'; @@ -9,6 +7,7 @@ import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/utils/lang.dart'; import 'package:mangayomi/views/browse/extension/refresh_filter_data.dart'; import 'package:mangayomi/views/browse/extension/widgets/extension_list_tile_widget.dart'; +import 'package:mangayomi/views/more/settings/browse/providers/browse_state_provider.dart'; class ExtensionScreen extends ConsumerWidget { final Function(dynamic) entriesData; @@ -30,7 +29,11 @@ class ExtensionScreen extends ConsumerWidget { .watch(fireImmediately: true), builder: (context, snapshot) { if (snapshot.hasData && snapshot.data!.isNotEmpty) { - final entries = snapshot.data!; + final entries = snapshot.data! + .where((element) => ref.watch(showNSFWStateProvider) + ? true + : element.isNsfw == false) + .toList(); entriesData(entries); return GroupedListView( elements: entriesFilter.isNotEmpty ? entriesFilter : entries, @@ -48,11 +51,6 @@ class ExtensionScreen extends ConsumerWidget { ), ), itemBuilder: (context, Source element) { - if (element.isCloudflare! && !Platform.isWindows || - element.isCloudflare! && !Platform.isLinux) { - return Container(); - } - return ExtensionListTileWidget( lang: element.lang!, onChanged: (val) { diff --git a/lib/views/browse/global_search_screen.dart b/lib/views/browse/global_search_screen.dart index 2e6367d3..3d8ed20c 100644 --- a/lib/views/browse/global_search_screen.dart +++ b/lib/views/browse/global_search_screen.dart @@ -7,10 +7,12 @@ import 'package:mangayomi/services/get_manga_detail.dart'; import 'package:mangayomi/services/search_manga.dart'; import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/sources/service.dart'; +import 'package:mangayomi/sources/source_list.dart'; import 'package:mangayomi/utils/cached_network.dart'; import 'package:mangayomi/utils/headers.dart'; import 'package:mangayomi/utils/lang.dart'; import 'package:mangayomi/views/library/search_text_form_field.dart'; +import 'package:mangayomi/views/more/settings/browse/providers/browse_state_provider.dart'; import 'package:mangayomi/views/widgets/bottom_text_widget.dart'; import 'package:mangayomi/views/widgets/manga_image_card_widget.dart'; @@ -28,7 +30,9 @@ class _GlobalSearchScreenState extends ConsumerState { final _textEditingController = TextEditingController(); @override Widget build(BuildContext context) { - final sourceList = isar.sources.filter().isAddedEqualTo(true).findAllSync(); + final sourceList = ref.watch(onlyIncludePinnedSourceStateProvider) + ? isar.sources.filter().isAddedEqualTo(true).findAllSync() + : sourcesList; return Scaffold( appBar: AppBar( leading: Container(), diff --git a/lib/views/browse/sources_screen.dart b/lib/views/browse/sources_screen.dart index 140ac6f8..424be7b5 100644 --- a/lib/views/browse/sources_screen.dart +++ b/lib/views/browse/sources_screen.dart @@ -10,6 +10,7 @@ import 'package:mangayomi/models/source.dart'; import 'package:mangayomi/utils/headers.dart'; import 'package:mangayomi/utils/lang.dart'; import 'package:mangayomi/views/browse/extension/refresh_filter_data.dart'; +import 'package:mangayomi/views/more/settings/browse/providers/browse_state_provider.dart'; class SourcesScreen extends ConsumerWidget { const SourcesScreen({super.key}); @@ -30,7 +31,11 @@ class SourcesScreen extends ConsumerWidget { if (!snapshot.hasData) { return const Center(child: Text("Empty")); } - final entries = snapshot.data!; + final entries = snapshot.data! + .where((element) => ref.watch(showNSFWStateProvider) + ? true + : element.isNsfw == false) + .toList(); return GroupedListView( elements: entries, groupBy: (element) => completeLang(element.lang!.toLowerCase()), diff --git a/lib/views/library/library_screen.dart b/lib/views/library/library_screen.dart index 7abe548a..bbe28db6 100644 --- a/lib/views/library/library_screen.dart +++ b/lib/views/library/library_screen.dart @@ -19,7 +19,7 @@ import 'package:mangayomi/views/library/widgets/library_listview_widget.dart'; import 'package:mangayomi/views/library/widgets/list_tile_manga_category.dart'; import 'package:mangayomi/views/manga/detail/widgets/chapter_filter_list_tile_widget.dart'; import 'package:mangayomi/views/manga/detail/widgets/chapter_sort_list_tile_widget.dart'; -import 'package:mangayomi/views/more/settings/categoties/providers/isar_providers.dart'; +import 'package:mangayomi/views/more/categoties/providers/isar_providers.dart'; import 'package:mangayomi/views/widgets/error_text.dart'; import 'package:mangayomi/views/widgets/progress_center.dart'; diff --git a/lib/views/library/widgets/library_gridview_widget.dart b/lib/views/library/widgets/library_gridview_widget.dart index ce6b9691..6c5d6ae6 100644 --- a/lib/views/library/widgets/library_gridview_widget.dart +++ b/lib/views/library/widgets/library_gridview_widget.dart @@ -10,7 +10,7 @@ import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/utils/cached_network.dart'; import 'package:mangayomi/utils/colors.dart'; import 'package:mangayomi/utils/headers.dart'; -import 'package:mangayomi/views/more/settings/providers/incognito_mode_state_provider.dart'; +import 'package:mangayomi/views/more/providers/incognito_mode_state_provider.dart'; import 'package:mangayomi/views/widgets/bottom_text_widget.dart'; import 'package:mangayomi/views/widgets/cover_view_widget.dart'; import 'package:mangayomi/views/widgets/error_text.dart'; diff --git a/lib/views/library/widgets/library_listview_widget.dart b/lib/views/library/widgets/library_listview_widget.dart index 11d7afe3..500359f8 100644 --- a/lib/views/library/widgets/library_listview_widget.dart +++ b/lib/views/library/widgets/library_listview_widget.dart @@ -10,7 +10,7 @@ import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/utils/cached_network.dart'; import 'package:mangayomi/utils/colors.dart'; import 'package:mangayomi/utils/headers.dart'; -import 'package:mangayomi/views/more/settings/providers/incognito_mode_state_provider.dart'; +import 'package:mangayomi/views/more/providers/incognito_mode_state_provider.dart'; import 'package:mangayomi/views/widgets/error_text.dart'; import 'package:mangayomi/views/widgets/listview_widget.dart'; import 'package:mangayomi/views/widgets/manga_image_card_widget.dart'; diff --git a/lib/views/general/general_screen.dart b/lib/views/main_view/main_screen.dart similarity index 94% rename from lib/views/general/general_screen.dart rename to lib/views/main_view/main_screen.dart index fb6730de..ae88b7da 100644 --- a/lib/views/general/general_screen.dart +++ b/lib/views/main_view/main_screen.dart @@ -7,18 +7,18 @@ import 'package:google_fonts/google_fonts.dart'; import 'package:mangayomi/utils/colors.dart'; import 'package:mangayomi/utils/media_query.dart'; import 'package:mangayomi/views/library/providers/library_state_provider.dart'; -import 'package:mangayomi/views/more/settings/providers/incognito_mode_state_provider.dart'; +import 'package:mangayomi/views/more/providers/incognito_mode_state_provider.dart'; -class GeneralScreen extends StatefulWidget { - const GeneralScreen({super.key, required this.child}); +class MainScreen extends StatefulWidget { + const MainScreen({super.key, required this.child}); final Widget child; @override - State createState() => _GeneralScreenState(); + State createState() => _MainScreenState(); } -class _GeneralScreenState extends State { +class _MainScreenState extends State { @override Widget build(BuildContext context) { final route = GoRouter.of(context); diff --git a/lib/views/manga/detail/manga_detail_view.dart b/lib/views/manga/detail/manga_detail_view.dart index 5e86d785..3d1f52dd 100644 --- a/lib/views/manga/detail/manga_detail_view.dart +++ b/lib/views/manga/detail/manga_detail_view.dart @@ -931,12 +931,13 @@ class _MangaDetailViewState extends ConsumerState backgroundColor: Theme.of(context).scaffoldBackgroundColor, elevation: 0), onPressed: () { - String url = getMangaAPIUrl(widget.manga!.source!).isEmpty - ? widget.manga!.link! - : "${getMangaBaseUrl(widget.manga!.source!)}${widget.manga!.link!}"; + final manga = widget.manga!; + String url = getMangaAPIUrl(manga.source!).isEmpty + ? manga.link! + : "${getMangaBaseUrl(manga.source!)}${manga.link!}"; Map data = { 'url': url, - 'source': widget.manga!.source!, + 'source': manga.source!, }; context.push("/mangawebview", extra: data); }, diff --git a/lib/views/manga/detail/manga_details_view.dart b/lib/views/manga/detail/manga_details_view.dart index 884647b3..d4e44af9 100644 --- a/lib/views/manga/detail/manga_details_view.dart +++ b/lib/views/manga/detail/manga_details_view.dart @@ -14,7 +14,7 @@ import 'package:mangayomi/utils/media_query.dart'; import 'package:mangayomi/views/manga/detail/manga_detail_view.dart'; import 'package:mangayomi/views/manga/detail/providers/state_providers.dart'; import 'package:mangayomi/views/manga/detail/widgets/chapter_filter_list_tile_widget.dart'; -import 'package:mangayomi/views/more/settings/providers/incognito_mode_state_provider.dart'; +import 'package:mangayomi/views/more/providers/incognito_mode_state_provider.dart'; import 'package:mangayomi/views/widgets/error_text.dart'; import 'package:mangayomi/views/widgets/progress_center.dart'; diff --git a/lib/views/manga/reader/manga_reader_view.dart b/lib/views/manga/reader/manga_reader_view.dart index 66e99ea1..fcc08c88 100644 --- a/lib/views/manga/reader/manga_reader_view.dart +++ b/lib/views/manga/reader/manga_reader_view.dart @@ -6,8 +6,11 @@ import 'package:extended_image/extended_image.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/main.dart'; import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/settings.dart'; +import 'package:mangayomi/sources/utils/utils.dart'; import 'package:mangayomi/views/manga/reader/providers/push_router.dart'; import 'package:mangayomi/services/get_chapter_url.dart'; import 'package:mangayomi/utils/image_detail_info.dart'; @@ -16,6 +19,7 @@ import 'package:mangayomi/views/manga/reader/image_view_horizontal.dart'; import 'package:mangayomi/views/manga/reader/image_view_vertical.dart'; import 'package:mangayomi/views/manga/reader/providers/reader_controller_provider.dart'; import 'package:mangayomi/views/manga/reader/widgets/circular_progress_indicator_animate_rotate.dart'; +import 'package:mangayomi/views/more/settings/reader/reader_screen.dart'; import 'package:mangayomi/views/widgets/progress_center.dart'; import 'package:photo_view/photo_view.dart'; import 'package:photo_view/photo_view_gallery.dart'; @@ -141,13 +145,26 @@ class _MangaChapterPageGalleryState super.dispose(); } + bool animatePageTransitions = + isar.settings.getSync(227)!.animatePageTransitions!; + 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); + } + @override void initState() { _doubleClickAnimationController = AnimationController( - duration: const Duration(milliseconds: 300), vsync: this); + duration: _doubleTapAnimationDuration(), vsync: this); _scaleAnimationController = AnimationController( - duration: const Duration(milliseconds: 300), vsync: this); + 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); @@ -202,10 +219,14 @@ class _MangaChapterPageGalleryState index: index, ); } else { - _itemScrollController.scrollTo( - curve: Curves.ease, - index: index, - duration: Duration(milliseconds: isSlide ? 2 : 150)); + animatePageTransitions + ? _itemScrollController.scrollTo( + curve: Curves.ease, + index: index, + duration: Duration(milliseconds: isSlide ? 2 : 150)) + : _itemScrollController.jumpTo( + index: index, + ); } } } else { @@ -214,9 +235,11 @@ class _MangaChapterPageGalleryState setState(() { _isZoom = false; }); - _extendedController.animateToPage(index, - duration: Duration(milliseconds: isSlide ? 2 : 150), - curve: Curves.ease); + animatePageTransitions + ? _extendedController.animateToPage(index, + duration: Duration(milliseconds: isSlide ? 2 : 150), + curve: Curves.ease) + : _extendedController.jumpToPage(index); } } } @@ -229,10 +252,14 @@ class _MangaChapterPageGalleryState index: index, ); } else { - _itemScrollController.scrollTo( - curve: Curves.ease, - index: index, - duration: Duration(milliseconds: isSlide ? 2 : 150)); + animatePageTransitions + ? _itemScrollController.scrollTo( + curve: Curves.ease, + index: index, + duration: Duration(milliseconds: isSlide ? 2 : 150)) + : _itemScrollController.jumpTo( + index: index, + ); } } } else { @@ -241,9 +268,11 @@ class _MangaChapterPageGalleryState setState(() { _isZoom = false; }); - _extendedController.animateToPage(index.toInt(), - duration: Duration(milliseconds: isSlide ? 2 : 150), - curve: Curves.ease); + animatePageTransitions + ? _extendedController.animateToPage(index, + duration: Duration(milliseconds: isSlide ? 2 : 150), + curve: Curves.ease) + : _extendedController.jumpToPage(index); } } } @@ -418,7 +447,18 @@ class _MangaChapterPageGalleryState ? Icons.bookmark : Icons.bookmark_border_outlined)), IconButton( - onPressed: () {}, icon: const Icon(Icons.public)), + onPressed: () { + final manga = widget.chapter.manga.value!; + String url = getMangaAPIUrl(manga.source!).isEmpty + ? manga.link! + : "${getMangaBaseUrl(manga.source!)}${manga.link!}"; + Map data = { + 'url': url, + 'source': manga.source!, + }; + context.push("/mangawebview", extra: data); + }, + icon: const Icon(Icons.public)), ], backgroundColor: _backgroundColor(context), ), @@ -611,8 +651,7 @@ class _MangaChapterPageGalleryState width: 7, ), Text( - widget.readerController - .getReaderModeValue(readerMode), + getReaderModeName(readerMode), style: const TextStyle( color: Colors.white, fontSize: 12, diff --git a/lib/views/manga/reader/providers/reader_controller_provider.dart b/lib/views/manga/reader/providers/reader_controller_provider.dart index f903374f..b360a07a 100644 --- a/lib/views/manga/reader/providers/reader_controller_provider.dart +++ b/lib/views/manga/reader/providers/reader_controller_provider.dart @@ -4,7 +4,7 @@ import 'package:mangayomi/models/chapter.dart'; import 'package:mangayomi/models/history.dart'; import 'package:mangayomi/models/manga.dart'; import 'package:mangayomi/models/settings.dart'; -import 'package:mangayomi/views/more/settings/providers/incognito_mode_state_provider.dart'; +import 'package:mangayomi/views/more/providers/incognito_mode_state_provider.dart'; import 'package:riverpod_annotation/riverpod_annotation.dart'; part 'reader_controller_provider.g.dart'; @@ -51,18 +51,6 @@ class ReaderController extends _$ReaderController { return isar.settings.getSync(227)!.defaultReaderMode; } - String getReaderModeValue(ReaderMode readerMode) { - return readerMode == ReaderMode.vertical - ? 'Vertical' - : readerMode == ReaderMode.verticalContinuous - ? 'Verical continuous' - : readerMode == ReaderMode.ltr - ? 'Left to Right' - : readerMode == ReaderMode.rtl - ? 'Right to Left' - : 'Webtoon'; - } - void setReaderMode(ReaderMode newReaderMode) { List? personalReaderModeLists = []; for (var personalReaderMode in getIsarSetting().personalReaderModeList!) { diff --git a/lib/views/manga/reader/providers/reader_controller_provider.g.dart b/lib/views/manga/reader/providers/reader_controller_provider.g.dart index a7c4c90f..31db143b 100644 --- a/lib/views/manga/reader/providers/reader_controller_provider.g.dart +++ b/lib/views/manga/reader/providers/reader_controller_provider.g.dart @@ -123,7 +123,7 @@ class CurrentIndexProvider } } -String _$readerControllerHash() => r'cffb8dfcfd338288d90757414d579fffcd478d29'; +String _$readerControllerHash() => r'f4d0d66cf65887527b59bb10feaab80cccdcb59a'; abstract class _$ReaderController extends BuildlessAutoDisposeNotifier { late final Chapter chapter; diff --git a/lib/views/more/settings/categoties/categories_screen.dart b/lib/views/more/categoties/categories_screen.dart similarity index 98% rename from lib/views/more/settings/categoties/categories_screen.dart rename to lib/views/more/categoties/categories_screen.dart index 7fc97fbf..eed62693 100644 --- a/lib/views/more/settings/categoties/categories_screen.dart +++ b/lib/views/more/categoties/categories_screen.dart @@ -2,8 +2,8 @@ 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/views/more/settings/categoties/providers/isar_providers.dart'; -import 'package:mangayomi/views/more/settings/categoties/widgets/custom_textfield.dart'; +import 'package:mangayomi/views/more/categoties/providers/isar_providers.dart'; +import 'package:mangayomi/views/more/categoties/widgets/custom_textfield.dart'; import 'package:mangayomi/views/widgets/progress_center.dart'; class CategoriesScreen extends ConsumerStatefulWidget { diff --git a/lib/views/more/settings/categoties/providers/isar_providers.dart b/lib/views/more/categoties/providers/isar_providers.dart similarity index 100% rename from lib/views/more/settings/categoties/providers/isar_providers.dart rename to lib/views/more/categoties/providers/isar_providers.dart diff --git a/lib/views/more/settings/categoties/providers/isar_providers.g.dart b/lib/views/more/categoties/providers/isar_providers.g.dart similarity index 100% rename from lib/views/more/settings/categoties/providers/isar_providers.g.dart rename to lib/views/more/categoties/providers/isar_providers.g.dart diff --git a/lib/views/more/settings/categoties/widgets/custom_textfield.dart b/lib/views/more/categoties/widgets/custom_textfield.dart similarity index 100% rename from lib/views/more/settings/categoties/widgets/custom_textfield.dart rename to lib/views/more/categoties/widgets/custom_textfield.dart diff --git a/lib/views/more/settings/providers/incognito_mode_state_provider.dart b/lib/views/more/providers/incognito_mode_state_provider.dart similarity index 100% rename from lib/views/more/settings/providers/incognito_mode_state_provider.dart rename to lib/views/more/providers/incognito_mode_state_provider.dart diff --git a/lib/views/more/settings/providers/incognito_mode_state_provider.g.dart b/lib/views/more/providers/incognito_mode_state_provider.g.dart similarity index 100% rename from lib/views/more/settings/providers/incognito_mode_state_provider.g.dart rename to lib/views/more/providers/incognito_mode_state_provider.g.dart diff --git a/lib/views/more/settings/browse/browse_screen.dart b/lib/views/more/settings/browse/browse_screen.dart new file mode 100644 index 00000000..23b47ffe --- /dev/null +++ b/lib/views/more/settings/browse/browse_screen.dart @@ -0,0 +1,89 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/utils/colors.dart'; +import 'package:mangayomi/views/more/settings/browse/providers/browse_state_provider.dart'; + +class BrowseSScreen extends ConsumerWidget { + const BrowseSScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final showNSFWS = ref.watch(showNSFWStateProvider); + final onlyIncludePinnedSource = + ref.watch(onlyIncludePinnedSourceStateProvider); + return Scaffold( + appBar: AppBar( + title: const Text("Browse"), + ), + body: Column( + children: [ + Padding( + padding: const EdgeInsets.only(bottom: 30), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: Row( + children: [ + Text("Global search", + style: TextStyle( + fontSize: 13, color: primaryColor(context))), + ], + ), + ), + SwitchListTile( + value: onlyIncludePinnedSource, + title: const Text("Only inclued pinned sources"), + onChanged: (value) { + ref + .read(onlyIncludePinnedSourceStateProvider.notifier) + .set(value); + }), + ], + ), + ), + Padding( + padding: const EdgeInsets.only(bottom: 10), + child: Column( + children: [ + Padding( + padding: const EdgeInsets.symmetric(horizontal: 15), + child: Row( + children: [ + Text("NSFW (18+) sources", + style: TextStyle( + fontSize: 13, color: primaryColor(context))), + ], + ), + ), + SwitchListTile( + value: showNSFWS, + title: const Text("Show in sources and extensions lists"), + onChanged: (value) { + ref.read(showNSFWStateProvider.notifier).set(value); + }), + ListTile( + title: Padding( + padding: const EdgeInsets.only(bottom: 8), + child: Row( + children: [ + Icon( + Icons.info_outline_rounded, + color: secondaryColor(context), + ), + ], + ), + ), + subtitle: Text( + "This does not prevent unofficial or potentially incorrectly flagged extensions from surfacing NSFW (18+) content within the app", + style: TextStyle( + fontSize: 11, color: secondaryColor(context))), + ) + ], + ), + ), + ], + ), + ); + } +} diff --git a/lib/views/more/settings/browse/providers/browse_state_provider.dart b/lib/views/more/settings/browse/providers/browse_state_provider.dart new file mode 100644 index 00000000..6e14097c --- /dev/null +++ b/lib/views/more/settings/browse/providers/browse_state_provider.dart @@ -0,0 +1,33 @@ +import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +part 'browse_state_provider.g.dart'; + +@riverpod +class OnlyIncludePinnedSourceState extends _$OnlyIncludePinnedSourceState { + @override + bool build() { + return isar.settings.getSync(227)!.onlyIncludePinnedSources!; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync(() => + isar.settings.putSync(settings!..onlyIncludePinnedSources = value)); + } +} + +@riverpod +class ShowNSFWState extends _$ShowNSFWState { + @override + bool build() { + return isar.settings.getSync(227)!.showNSFW!; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync(() => isar.settings.putSync(settings!..showNSFW = value)); + } +} diff --git a/lib/views/more/settings/browse/providers/browse_state_provider.g.dart b/lib/views/more/settings/browse/providers/browse_state_provider.g.dart new file mode 100644 index 00000000..4281073b --- /dev/null +++ b/lib/views/more/settings/browse/providers/browse_state_provider.g.dart @@ -0,0 +1,42 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'browse_state_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$onlyIncludePinnedSourceStateHash() => + r'77c4bff96e186c4bce0a5c312871ceec88a269d0'; + +/// See also [OnlyIncludePinnedSourceState]. +@ProviderFor(OnlyIncludePinnedSourceState) +final onlyIncludePinnedSourceStateProvider = + AutoDisposeNotifierProvider.internal( + OnlyIncludePinnedSourceState.new, + name: r'onlyIncludePinnedSourceStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$onlyIncludePinnedSourceStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$OnlyIncludePinnedSourceState = AutoDisposeNotifier; +String _$showNSFWStateHash() => r'fdb147ceef80a95066adc64ee63237fbdb3de81e'; + +/// See also [ShowNSFWState]. +@ProviderFor(ShowNSFWState) +final showNSFWStateProvider = + AutoDisposeNotifierProvider.internal( + ShowNSFWState.new, + name: r'showNSFWStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$showNSFWStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$ShowNSFWState = AutoDisposeNotifier; +// ignore_for_file: unnecessary_raw_strings, subtype_of_sealed_class, invalid_use_of_internal_member, do_not_use_environment, prefer_const_constructors, public_member_api_docs, avoid_private_typedef_functions diff --git a/lib/views/more/settings/general/general_screen.dart b/lib/views/more/settings/general/general_screen.dart new file mode 100644 index 00000000..495bf2ce --- /dev/null +++ b/lib/views/more/settings/general/general_screen.dart @@ -0,0 +1,78 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/utils/colors.dart'; +import 'package:mangayomi/utils/media_query.dart'; + +class GeneralScreen extends ConsumerWidget { + const GeneralScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + return Scaffold( + appBar: AppBar( + title: const Text("General"), + ), + body: Column( + children: [ + ListTile( + onTap: () { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: const Text( + "App language", + ), + content: SizedBox( + width: mediaWidth(context, 0.8), + child: ListView.builder( + shrinkWrap: true, + itemCount: 1, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: index, + groupValue: 0, + onChanged: (value) { + Navigator.pop(context); + }, + title: const Row( + children: [Text("English")], + ), + ); + }, + )), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () async { + Navigator.pop(context); + }, + child: Text( + "Cancel", + style: + TextStyle(color: primaryColor(context)), + )), + ], + ) + ], + ); + }); + }, + title: const Text( + "App language", + style: TextStyle(), + ), + subtitle: Text( + "English", + style: TextStyle(fontSize: 11, color: secondaryColor(context)), + ), + ), + ], + ), + ); + } +} diff --git a/lib/views/more/settings/reader/providers/reader_state_provider.dart b/lib/views/more/settings/reader/providers/reader_state_provider.dart new file mode 100644 index 00000000..62aa4047 --- /dev/null +++ b/lib/views/more/settings/reader/providers/reader_state_provider.dart @@ -0,0 +1,49 @@ +import 'package:mangayomi/main.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:riverpod_annotation/riverpod_annotation.dart'; +part 'reader_state_provider.g.dart'; + +@riverpod +class DefaultReadingModeState extends _$DefaultReadingModeState { + @override + ReaderMode build() { + return isar.settings.getSync(227)!.defaultReaderMode; + } + + void set(ReaderMode value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync(settings!..defaultReaderMode = value)); + } +} + +@riverpod +class AnimatePageTransitionsState extends _$AnimatePageTransitionsState { + @override + bool build() { + return isar.settings.getSync(227)!.animatePageTransitions!; + } + + void set(bool value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync(settings!..animatePageTransitions = value)); + } +} + +@riverpod +class DoubleTapAnimationSpeedState extends _$DoubleTapAnimationSpeedState { + @override + int build() { + return isar.settings.getSync(227)!.doubleTapAnimationSpeed!; + } + + void set(int value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync(() => + isar.settings.putSync(settings!..doubleTapAnimationSpeed = value)); + } +} diff --git a/lib/views/more/settings/reader/providers/reader_state_provider.g.dart b/lib/views/more/settings/reader/providers/reader_state_provider.g.dart new file mode 100644 index 00000000..19446a05 --- /dev/null +++ b/lib/views/more/settings/reader/providers/reader_state_provider.g.dart @@ -0,0 +1,60 @@ +// GENERATED CODE - DO NOT MODIFY BY HAND + +part of 'reader_state_provider.dart'; + +// ************************************************************************** +// RiverpodGenerator +// ************************************************************************** + +String _$defaultReadingModeStateHash() => + r'2fe1d264041dd115bcc1a8c5648d0062a19f4c44'; + +/// See also [DefaultReadingModeState]. +@ProviderFor(DefaultReadingModeState) +final defaultReadingModeStateProvider = + AutoDisposeNotifierProvider.internal( + DefaultReadingModeState.new, + name: r'defaultReadingModeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$defaultReadingModeStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$DefaultReadingModeState = AutoDisposeNotifier; +String _$animatePageTransitionsStateHash() => + r'c8fdb2acb7a551c41a54c1aa14e378f6b1edd5c1'; + +/// See also [AnimatePageTransitionsState]. +@ProviderFor(AnimatePageTransitionsState) +final animatePageTransitionsStateProvider = + AutoDisposeNotifierProvider.internal( + AnimatePageTransitionsState.new, + name: r'animatePageTransitionsStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$animatePageTransitionsStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$AnimatePageTransitionsState = AutoDisposeNotifier; +String _$doubleTapAnimationSpeedStateHash() => + r'd88657a8a587a0a77b6230a7fe5b2c1b833afca8'; + +/// See also [DoubleTapAnimationSpeedState]. +@ProviderFor(DoubleTapAnimationSpeedState) +final doubleTapAnimationSpeedStateProvider = + AutoDisposeNotifierProvider.internal( + DoubleTapAnimationSpeedState.new, + name: r'doubleTapAnimationSpeedStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$doubleTapAnimationSpeedStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$DoubleTapAnimationSpeedState = AutoDisposeNotifier; +// ignore_for_file: unnecessary_raw_strings, subtype_of_sealed_class, invalid_use_of_internal_member, do_not_use_environment, prefer_const_constructors, public_member_api_docs, avoid_private_typedef_functions diff --git a/lib/views/more/settings/reader/reader_screen.dart b/lib/views/more/settings/reader/reader_screen.dart new file mode 100644 index 00000000..d64a57c5 --- /dev/null +++ b/lib/views/more/settings/reader/reader_screen.dart @@ -0,0 +1,183 @@ +import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:mangayomi/models/settings.dart'; +import 'package:mangayomi/utils/colors.dart'; +import 'package:mangayomi/utils/media_query.dart'; +import 'package:mangayomi/views/more/settings/reader/providers/reader_state_provider.dart'; + +class ReaderScreen extends ConsumerWidget { + const ReaderScreen({super.key}); + + @override + Widget build(BuildContext context, WidgetRef ref) { + final defaultReadingMode = ref.watch(defaultReadingModeStateProvider); + final animatePageTransitions = + ref.watch(animatePageTransitionsStateProvider); + final doubleTapAnimationSpeed = + ref.watch(doubleTapAnimationSpeedStateProvider); + return Scaffold( + appBar: AppBar( + title: const Text("Reader"), + ), + body: Column( + children: [ + ListTile( + onTap: () { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: const Text( + "Default reading mode", + ), + content: SizedBox( + width: mediaWidth(context, 0.8), + child: ListView.builder( + shrinkWrap: true, + itemCount: ReaderMode.values.length, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: ReaderMode.values[index], + groupValue: defaultReadingMode, + onChanged: (value) { + ref + .read(defaultReadingModeStateProvider + .notifier) + .set(value!); + Navigator.pop(context); + }, + title: Row( + children: [ + Text(getReaderModeName( + ReaderMode.values[index])) + ], + ), + ); + }, + )), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () async { + Navigator.pop(context); + }, + child: Text( + "Cancel", + style: + TextStyle(color: primaryColor(context)), + )), + ], + ) + ], + ); + }); + }, + title: const Text( + "Default reading mode", + style: TextStyle(), + ), + subtitle: Text( + getReaderModeName(defaultReadingMode), + style: TextStyle(fontSize: 11, color: secondaryColor(context)), + ), + ), + ListTile( + onTap: () { + showDialog( + context: context, + builder: (context) { + return AlertDialog( + title: const Text( + "Double tap animation speed", + ), + content: SizedBox( + width: mediaWidth(context, 0.8), + child: ListView.builder( + shrinkWrap: true, + itemCount: 3, + itemBuilder: (context, index) { + return RadioListTile( + dense: true, + contentPadding: const EdgeInsets.all(0), + value: index, + groupValue: doubleTapAnimationSpeed, + onChanged: (value) { + ref + .read(doubleTapAnimationSpeedStateProvider + .notifier) + .set(value!); + Navigator.pop(context); + }, + title: Row( + children: [ + Text(getAnimationSpeedName(index)) + ], + ), + ); + }, + )), + actions: [ + Row( + mainAxisAlignment: MainAxisAlignment.end, + children: [ + TextButton( + onPressed: () async { + Navigator.pop(context); + }, + child: Text( + "Cancel", + style: + TextStyle(color: primaryColor(context)), + )), + ], + ) + ], + ); + }); + }, + title: const Text( + "Double tap animation speed", + style: TextStyle(), + ), + subtitle: Text( + getAnimationSpeedName(doubleTapAnimationSpeed), + style: TextStyle(fontSize: 11, color: secondaryColor(context)), + ), + ), + SwitchListTile( + value: animatePageTransitions, + title: const Text("Animate page transitions"), + onChanged: (value) { + ref + .read(animatePageTransitionsStateProvider.notifier) + .set(value); + }), + ], + ), + ); + } +} + +String getReaderModeName(ReaderMode readerMode) { + return readerMode == ReaderMode.vertical + ? 'Vertical' + : readerMode == ReaderMode.verticalContinuous + ? 'Verical continuous' + : readerMode == ReaderMode.ltr + ? 'Left to Right' + : readerMode == ReaderMode.rtl + ? 'Right to Left' + : 'Webtoon'; +} + +String getAnimationSpeedName(int type) { + return type == 0 + ? 'No animation' + : type == 1 + ? 'Normal' + : "Fast"; +} diff --git a/lib/views/more/settings/settings_screen.dart b/lib/views/more/settings/settings_screen.dart index 0e773f1b..1c34c2a0 100644 --- a/lib/views/more/settings/settings_screen.dart +++ b/lib/views/more/settings/settings_screen.dart @@ -17,27 +17,27 @@ class SettingsScreen extends StatelessWidget { title: 'General', subtitle: 'App language', icon: Icons.tune_rounded, - onTap: () {}), + onTap: () => context.push('/general')), ListTileWidget( title: 'Appearance', subtitle: 'Theme', icon: Icons.color_lens_rounded, onTap: () => context.push('/appearance')), - ListTileWidget( - title: 'Library', - subtitle: 'Categories', - icon: Icons.collections_bookmark_rounded, - onTap: () {}), + // ListTileWidget( + // title: 'Library', + // subtitle: 'Categories', + // icon: Icons.collections_bookmark_rounded, + // onTap: () {}), ListTileWidget( title: 'Reader', subtitle: 'Reading mode, display, navigation', icon: Icons.chrome_reader_mode_rounded, - onTap: () {}), + onTap: () => context.push('/readerMode')), ListTileWidget( title: 'Browse', - subtitle: 'Sources, extensions, global search', + subtitle: 'Sources, global search', icon: Icons.explore_rounded, - onTap: () {}), + onTap: () => context.push('/browseS')), ListTileWidget( onTap: () { context.push('/about'); diff --git a/lib/views/more/widgets/incognito_mode_widget.dart b/lib/views/more/widgets/incognito_mode_widget.dart index 5ce67cbf..007c6966 100644 --- a/lib/views/more/widgets/incognito_mode_widget.dart +++ b/lib/views/more/widgets/incognito_mode_widget.dart @@ -1,7 +1,7 @@ import 'package:flutter/cupertino.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; -import 'package:mangayomi/views/more/settings/providers/incognito_mode_state_provider.dart'; +import 'package:mangayomi/views/more/providers/incognito_mode_state_provider.dart'; import 'package:mangayomi/views/more/widgets/list_tile_widget.dart'; class IncognitoModeWidget extends ConsumerWidget {