From 235db734d2ff53139bbfed0606d169e8e4afe05a Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sat, 25 Jan 2025 21:15:36 +0100 Subject: [PATCH] allow user to reorder and toggle each navigation item --- lib/l10n/app_de.arb | 3 +- lib/l10n/app_en.arb | 3 +- lib/models/settings.dart | 21 +- lib/models/settings.g.dart | 1025 +++++++++++------ lib/modules/browse/browse_screen.dart | 40 +- lib/modules/history/history_screen.dart | 31 +- lib/modules/main_view/main_screen.dart | 302 +++-- .../more/categories/categories_screen.dart | 22 +- .../appearance/appearance_screen.dart | 166 +-- .../providers/reader_state_provider.dart | 48 +- .../providers/reader_state_provider.g.dart | 53 +- lib/modules/updates/updates_screen.dart | 31 +- lib/router/router.dart | 13 + lib/services/aniskip.g.dart | 2 +- lib/services/trackers/anilist.g.dart | 2 +- 15 files changed, 1036 insertions(+), 726 deletions(-) diff --git a/lib/l10n/app_de.arb b/lib/l10n/app_de.arb index 632fb6c4..a2ffa65a 100644 --- a/lib/l10n/app_de.arb +++ b/lib/l10n/app_de.arb @@ -385,7 +385,8 @@ "n_day_ago": "Vor {day} Tag", "now": "jetzt", "library_last_updated": "Bibliothek zuletzt am {lastUpdated} aktualisiert.", - "reorder_navigation": "Passe die Navigation für dich selber an.", + "reorder_navigation": "Navigation anpassen", + "reorder_navigation_description": "Du kannst die Anordnung und Sichbarheit der Navigation für dich selber anpassen.", "hide_manga": "Einige Elemente bezüglich Mangas ausblenden.", "hide_anime": "Einige Elemente bezüglich Animes ausblenden.", "hide_novel": "Einige Elemente bezüglich (Light-)Novels ausblenden.", diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index 7d66289d..46c09806 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -215,7 +215,8 @@ "sync_confirm_download": "A full download will completely replace your current data with the remote one!", "dialog_confirm": "Confirm", "description": "Description", - "reorder_navigation": "Customize the navigation to your needs.", + "reorder_navigation": "Customize navigation", + "reorder_navigation_description": "Reorder and toggle each navigation to your needs.", "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.", diff --git a/lib/models/settings.dart b/lib/models/settings.dart index 63186672..59a7269c 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -220,11 +220,9 @@ class Settings { @enumerated late NovelTextAlign novelTextAlign; - bool? hideManga; + List? navigationOrder; - bool? hideAnime; - - bool? hideNovel; + List? hideItems; bool? clearChapterCacheOnAppLaunch; @@ -325,9 +323,8 @@ class Settings { this.novelDisplayType = DisplayType.comfortableGrid, this.novelFontSize = 14, this.novelTextAlign = NovelTextAlign.left, - this.hideManga = false, - this.hideAnime = false, - this.hideNovel = false, + this.navigationOrder, + this.hideItems, this.clearChapterCacheOnAppLaunch = false}); Settings.fromJson(Map json) { @@ -503,9 +500,8 @@ class Settings { } novelTextAlign = NovelTextAlign .values[json['novelTextAlign'] ?? NovelTextAlign.left.index]; - hideManga = json['hideManga']; - hideAnime = json['hideAnime']; - hideNovel = json['hideNovel']; + navigationOrder = json['navigationOrder']?.cast(); + hideItems = json['hideItems']?.cast(); clearChapterCacheOnAppLaunch = json['clearChapterCacheOnAppLaunch']; } @@ -621,9 +617,8 @@ class Settings { 'novelDisplayType': novelDisplayType.index, 'novelFontSize': novelFontSize, 'novelTextAlign': novelTextAlign.index, - 'hideManga': hideManga, - 'hideAnime': hideAnime, - 'hideNovel': hideNovel, + 'navigationOrder': navigationOrder, + 'hideItems': hideItems, 'clearChapterCacheOnAppLaunch': clearChapterCacheOnAppLaunch }; } diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index 8c268d52..c5b90f35 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -272,295 +272,290 @@ const SettingsSchema = CollectionSchema( name: r'fullScreenReader', type: IsarType.bool, ), - r'hideAnime': PropertySchema( + r'hideItems': PropertySchema( id: 48, - name: r'hideAnime', - type: IsarType.bool, - ), - r'hideManga': PropertySchema( - id: 49, - name: r'hideManga', - type: IsarType.bool, - ), - r'hideNovel': PropertySchema( - id: 50, - name: r'hideNovel', - type: IsarType.bool, + name: r'hideItems', + type: IsarType.stringList, ), r'incognitoMode': PropertySchema( - id: 51, + id: 49, name: r'incognitoMode', type: IsarType.bool, ), r'libraryDownloadedChapters': PropertySchema( - id: 52, + id: 50, name: r'libraryDownloadedChapters', type: IsarType.bool, ), r'libraryFilterAnimeBookMarkedType': PropertySchema( - id: 53, + id: 51, name: r'libraryFilterAnimeBookMarkedType', type: IsarType.long, ), r'libraryFilterAnimeDownloadType': PropertySchema( - id: 54, + id: 52, name: r'libraryFilterAnimeDownloadType', type: IsarType.long, ), r'libraryFilterAnimeStartedType': PropertySchema( - id: 55, + id: 53, name: r'libraryFilterAnimeStartedType', type: IsarType.long, ), r'libraryFilterAnimeUnreadType': PropertySchema( - id: 56, + id: 54, name: r'libraryFilterAnimeUnreadType', type: IsarType.long, ), r'libraryFilterMangasBookMarkedType': PropertySchema( - id: 57, + id: 55, name: r'libraryFilterMangasBookMarkedType', type: IsarType.long, ), r'libraryFilterMangasDownloadType': PropertySchema( - id: 58, + id: 56, name: r'libraryFilterMangasDownloadType', type: IsarType.long, ), r'libraryFilterMangasStartedType': PropertySchema( - id: 59, + id: 57, name: r'libraryFilterMangasStartedType', type: IsarType.long, ), r'libraryFilterMangasUnreadType': PropertySchema( - id: 60, + id: 58, name: r'libraryFilterMangasUnreadType', type: IsarType.long, ), r'libraryFilterNovelBookMarkedType': PropertySchema( - id: 61, + id: 59, name: r'libraryFilterNovelBookMarkedType', type: IsarType.long, ), r'libraryFilterNovelDownloadType': PropertySchema( - id: 62, + id: 60, name: r'libraryFilterNovelDownloadType', type: IsarType.long, ), r'libraryFilterNovelStartedType': PropertySchema( - id: 63, + id: 61, name: r'libraryFilterNovelStartedType', type: IsarType.long, ), r'libraryFilterNovelUnreadType': PropertySchema( - id: 64, + id: 62, name: r'libraryFilterNovelUnreadType', type: IsarType.long, ), r'libraryLocalSource': PropertySchema( - id: 65, + id: 63, name: r'libraryLocalSource', type: IsarType.bool, ), r'libraryShowCategoryTabs': PropertySchema( - id: 66, + id: 64, name: r'libraryShowCategoryTabs', type: IsarType.bool, ), r'libraryShowContinueReadingButton': PropertySchema( - id: 67, + id: 65, name: r'libraryShowContinueReadingButton', type: IsarType.bool, ), r'libraryShowLanguage': PropertySchema( - id: 68, + id: 66, name: r'libraryShowLanguage', type: IsarType.bool, ), r'libraryShowNumbersOfItems': PropertySchema( - id: 69, + id: 67, name: r'libraryShowNumbersOfItems', type: IsarType.bool, ), r'locale': PropertySchema( - id: 70, + id: 68, name: r'locale', type: IsarType.object, target: r'L10nLocale', ), r'mangaGridSize': PropertySchema( - id: 71, + id: 69, name: r'mangaGridSize', type: IsarType.long, ), r'mangaHomeDisplayType': PropertySchema( - id: 72, + id: 70, name: r'mangaHomeDisplayType', type: IsarType.byte, enumMap: _SettingsmangaHomeDisplayTypeEnumValueMap, ), r'markEpisodeAsSeenType': PropertySchema( - id: 73, + id: 71, name: r'markEpisodeAsSeenType', type: IsarType.long, ), + r'navigationOrder': PropertySchema( + id: 72, + name: r'navigationOrder', + type: IsarType.stringList, + ), r'novelDisplayType': PropertySchema( - id: 74, + id: 73, name: r'novelDisplayType', type: IsarType.byte, enumMap: _SettingsnovelDisplayTypeEnumValueMap, ), r'novelFontSize': PropertySchema( - id: 75, + id: 74, name: r'novelFontSize', type: IsarType.long, ), r'novelGridSize': PropertySchema( - id: 76, + id: 75, name: r'novelGridSize', type: IsarType.long, ), r'novelLibraryDownloadedChapters': PropertySchema( - id: 77, + id: 76, name: r'novelLibraryDownloadedChapters', type: IsarType.bool, ), r'novelLibraryLocalSource': PropertySchema( - id: 78, + id: 77, name: r'novelLibraryLocalSource', type: IsarType.bool, ), r'novelLibraryShowCategoryTabs': PropertySchema( - id: 79, + id: 78, name: r'novelLibraryShowCategoryTabs', type: IsarType.bool, ), r'novelLibraryShowContinueReadingButton': PropertySchema( - id: 80, + id: 79, name: r'novelLibraryShowContinueReadingButton', type: IsarType.bool, ), r'novelLibraryShowLanguage': PropertySchema( - id: 81, + id: 80, name: r'novelLibraryShowLanguage', type: IsarType.bool, ), r'novelLibraryShowNumbersOfItems': PropertySchema( - id: 82, + id: 81, name: r'novelLibraryShowNumbersOfItems', type: IsarType.bool, ), r'novelTextAlign': PropertySchema( - id: 83, + id: 82, name: r'novelTextAlign', type: IsarType.byte, enumMap: _SettingsnovelTextAlignEnumValueMap, ), r'onlyIncludePinnedSources': PropertySchema( - id: 84, + id: 83, name: r'onlyIncludePinnedSources', type: IsarType.bool, ), r'pagePreloadAmount': PropertySchema( - id: 85, + id: 84, name: r'pagePreloadAmount', type: IsarType.long, ), r'personalPageModeList': PropertySchema( - id: 86, + id: 85, name: r'personalPageModeList', type: IsarType.objectList, target: r'PersonalPageMode', ), r'personalReaderModeList': PropertySchema( - id: 87, + id: 86, name: r'personalReaderModeList', type: IsarType.objectList, target: r'PersonalReaderMode', ), r'playerSubtitleSettings': PropertySchema( - id: 88, + id: 87, name: r'playerSubtitleSettings', type: IsarType.object, target: r'PlayerSubtitleSettings', ), r'pureBlackDarkMode': PropertySchema( - id: 89, + id: 88, name: r'pureBlackDarkMode', type: IsarType.bool, ), r'relativeTimesTamps': PropertySchema( - id: 90, + id: 89, name: r'relativeTimesTamps', type: IsarType.long, ), r'saveAsCBZArchive': PropertySchema( - id: 91, + id: 90, name: r'saveAsCBZArchive', type: IsarType.bool, ), r'scaleType': PropertySchema( - id: 92, + id: 91, name: r'scaleType', type: IsarType.byte, enumMap: _SettingsscaleTypeEnumValueMap, ), r'showPagesNumber': PropertySchema( - id: 93, + id: 92, name: r'showPagesNumber', type: IsarType.bool, ), r'sortChapterList': PropertySchema( - id: 94, + id: 93, name: r'sortChapterList', type: IsarType.objectList, target: r'SortChapter', ), r'sortLibraryAnime': PropertySchema( - id: 95, + id: 94, name: r'sortLibraryAnime', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryManga': PropertySchema( - id: 96, + id: 95, name: r'sortLibraryManga', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryNovel': PropertySchema( - id: 97, + id: 96, name: r'sortLibraryNovel', type: IsarType.object, target: r'SortLibraryManga', ), r'startDatebackup': PropertySchema( - id: 98, + id: 97, name: r'startDatebackup', type: IsarType.long, ), r'themeIsDark': PropertySchema( - id: 99, + id: 98, name: r'themeIsDark', type: IsarType.bool, ), r'updateProgressAfterReading': PropertySchema( - id: 100, + id: 99, name: r'updateProgressAfterReading', type: IsarType.bool, ), r'useLibass': PropertySchema( - id: 101, + id: 100, name: r'useLibass', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( - id: 102, + id: 101, name: r'usePageTapZones', type: IsarType.bool, ), r'userAgent': PropertySchema( - id: 103, + id: 102, name: r'userAgent', type: IsarType.string, ) @@ -763,6 +758,18 @@ int _settingsEstimateSize( } } } + { + final list = object.hideItems; + if (list != null) { + bytesCount += 3 + list.length * 3; + { + for (var i = 0; i < list.length; i++) { + final value = list[i]; + bytesCount += value.length * 3; + } + } + } + } { final value = object.locale; if (value != null) { @@ -771,6 +778,18 @@ int _settingsEstimateSize( value, allOffsets[L10nLocale]!, allOffsets); } } + { + final list = object.navigationOrder; + if (list != null) { + bytesCount += 3 + list.length * 3; + { + for (var i = 0; i < list.length; i++) { + final value = list[i]; + bytesCount += value.length * 3; + } + } + } + } { final list = object.personalPageModeList; if (list != null) { @@ -953,102 +972,101 @@ void _settingsSerialize( writer.writeLong(offsets[45], object.flexSchemeColorIndex); writer.writeBool(offsets[46], object.fullScreenPlayer); writer.writeBool(offsets[47], object.fullScreenReader); - writer.writeBool(offsets[48], object.hideAnime); - writer.writeBool(offsets[49], object.hideManga); - writer.writeBool(offsets[50], object.hideNovel); - writer.writeBool(offsets[51], object.incognitoMode); - writer.writeBool(offsets[52], object.libraryDownloadedChapters); - writer.writeLong(offsets[53], object.libraryFilterAnimeBookMarkedType); - writer.writeLong(offsets[54], object.libraryFilterAnimeDownloadType); - writer.writeLong(offsets[55], object.libraryFilterAnimeStartedType); - writer.writeLong(offsets[56], object.libraryFilterAnimeUnreadType); - writer.writeLong(offsets[57], object.libraryFilterMangasBookMarkedType); - writer.writeLong(offsets[58], object.libraryFilterMangasDownloadType); - writer.writeLong(offsets[59], object.libraryFilterMangasStartedType); - writer.writeLong(offsets[60], object.libraryFilterMangasUnreadType); - writer.writeLong(offsets[61], object.libraryFilterNovelBookMarkedType); - writer.writeLong(offsets[62], object.libraryFilterNovelDownloadType); - writer.writeLong(offsets[63], object.libraryFilterNovelStartedType); - writer.writeLong(offsets[64], object.libraryFilterNovelUnreadType); - writer.writeBool(offsets[65], object.libraryLocalSource); - writer.writeBool(offsets[66], object.libraryShowCategoryTabs); - writer.writeBool(offsets[67], object.libraryShowContinueReadingButton); - writer.writeBool(offsets[68], object.libraryShowLanguage); - writer.writeBool(offsets[69], object.libraryShowNumbersOfItems); + writer.writeStringList(offsets[48], object.hideItems); + writer.writeBool(offsets[49], object.incognitoMode); + writer.writeBool(offsets[50], object.libraryDownloadedChapters); + writer.writeLong(offsets[51], object.libraryFilterAnimeBookMarkedType); + writer.writeLong(offsets[52], object.libraryFilterAnimeDownloadType); + writer.writeLong(offsets[53], object.libraryFilterAnimeStartedType); + writer.writeLong(offsets[54], object.libraryFilterAnimeUnreadType); + writer.writeLong(offsets[55], object.libraryFilterMangasBookMarkedType); + writer.writeLong(offsets[56], object.libraryFilterMangasDownloadType); + writer.writeLong(offsets[57], object.libraryFilterMangasStartedType); + writer.writeLong(offsets[58], object.libraryFilterMangasUnreadType); + writer.writeLong(offsets[59], object.libraryFilterNovelBookMarkedType); + writer.writeLong(offsets[60], object.libraryFilterNovelDownloadType); + writer.writeLong(offsets[61], object.libraryFilterNovelStartedType); + writer.writeLong(offsets[62], object.libraryFilterNovelUnreadType); + writer.writeBool(offsets[63], object.libraryLocalSource); + writer.writeBool(offsets[64], object.libraryShowCategoryTabs); + writer.writeBool(offsets[65], object.libraryShowContinueReadingButton); + writer.writeBool(offsets[66], object.libraryShowLanguage); + writer.writeBool(offsets[67], object.libraryShowNumbersOfItems); writer.writeObject( - offsets[70], + offsets[68], allOffsets, L10nLocaleSchema.serialize, object.locale, ); - writer.writeLong(offsets[71], object.mangaGridSize); - writer.writeByte(offsets[72], object.mangaHomeDisplayType.index); - writer.writeLong(offsets[73], object.markEpisodeAsSeenType); - writer.writeByte(offsets[74], object.novelDisplayType.index); - writer.writeLong(offsets[75], object.novelFontSize); - writer.writeLong(offsets[76], object.novelGridSize); - writer.writeBool(offsets[77], object.novelLibraryDownloadedChapters); - writer.writeBool(offsets[78], object.novelLibraryLocalSource); - writer.writeBool(offsets[79], object.novelLibraryShowCategoryTabs); - writer.writeBool(offsets[80], object.novelLibraryShowContinueReadingButton); - writer.writeBool(offsets[81], object.novelLibraryShowLanguage); - writer.writeBool(offsets[82], object.novelLibraryShowNumbersOfItems); - writer.writeByte(offsets[83], object.novelTextAlign.index); - writer.writeBool(offsets[84], object.onlyIncludePinnedSources); - writer.writeLong(offsets[85], object.pagePreloadAmount); + writer.writeLong(offsets[69], object.mangaGridSize); + writer.writeByte(offsets[70], object.mangaHomeDisplayType.index); + writer.writeLong(offsets[71], object.markEpisodeAsSeenType); + writer.writeStringList(offsets[72], object.navigationOrder); + writer.writeByte(offsets[73], object.novelDisplayType.index); + writer.writeLong(offsets[74], object.novelFontSize); + writer.writeLong(offsets[75], object.novelGridSize); + writer.writeBool(offsets[76], object.novelLibraryDownloadedChapters); + writer.writeBool(offsets[77], object.novelLibraryLocalSource); + writer.writeBool(offsets[78], object.novelLibraryShowCategoryTabs); + writer.writeBool(offsets[79], object.novelLibraryShowContinueReadingButton); + writer.writeBool(offsets[80], object.novelLibraryShowLanguage); + writer.writeBool(offsets[81], object.novelLibraryShowNumbersOfItems); + writer.writeByte(offsets[82], object.novelTextAlign.index); + writer.writeBool(offsets[83], object.onlyIncludePinnedSources); + writer.writeLong(offsets[84], object.pagePreloadAmount); writer.writeObjectList( - offsets[86], + offsets[85], allOffsets, PersonalPageModeSchema.serialize, object.personalPageModeList, ); writer.writeObjectList( - offsets[87], + offsets[86], allOffsets, PersonalReaderModeSchema.serialize, object.personalReaderModeList, ); writer.writeObject( - offsets[88], + offsets[87], allOffsets, PlayerSubtitleSettingsSchema.serialize, object.playerSubtitleSettings, ); - writer.writeBool(offsets[89], object.pureBlackDarkMode); - writer.writeLong(offsets[90], object.relativeTimesTamps); - writer.writeBool(offsets[91], object.saveAsCBZArchive); - writer.writeByte(offsets[92], object.scaleType.index); - writer.writeBool(offsets[93], object.showPagesNumber); + writer.writeBool(offsets[88], object.pureBlackDarkMode); + writer.writeLong(offsets[89], object.relativeTimesTamps); + writer.writeBool(offsets[90], object.saveAsCBZArchive); + writer.writeByte(offsets[91], object.scaleType.index); + writer.writeBool(offsets[92], object.showPagesNumber); writer.writeObjectList( - offsets[94], + offsets[93], allOffsets, SortChapterSchema.serialize, object.sortChapterList, ); writer.writeObject( - offsets[95], + offsets[94], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryAnime, ); writer.writeObject( - offsets[96], + offsets[95], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryManga, ); writer.writeObject( - offsets[97], + offsets[96], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryNovel, ); - writer.writeLong(offsets[98], object.startDatebackup); - writer.writeBool(offsets[99], object.themeIsDark); - writer.writeBool(offsets[100], object.updateProgressAfterReading); - writer.writeBool(offsets[101], object.useLibass); - writer.writeBool(offsets[102], object.usePageTapZones); - writer.writeString(offsets[103], object.userAgent); + writer.writeLong(offsets[97], object.startDatebackup); + writer.writeBool(offsets[98], object.themeIsDark); + writer.writeBool(offsets[99], object.updateProgressAfterReading); + writer.writeBool(offsets[100], object.useLibass); + writer.writeBool(offsets[101], object.usePageTapZones); + writer.writeString(offsets[102], object.userAgent); } Settings _settingsDeserialize( @@ -1144,100 +1162,99 @@ Settings _settingsDeserialize( flexSchemeColorIndex: reader.readLongOrNull(offsets[45]), fullScreenPlayer: reader.readBoolOrNull(offsets[46]), fullScreenReader: reader.readBoolOrNull(offsets[47]), - hideAnime: reader.readBoolOrNull(offsets[48]), - hideManga: reader.readBoolOrNull(offsets[49]), - hideNovel: reader.readBoolOrNull(offsets[50]), + hideItems: reader.readStringList(offsets[48]), id: id, - incognitoMode: reader.readBoolOrNull(offsets[51]), - libraryDownloadedChapters: reader.readBoolOrNull(offsets[52]), - libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[53]), - libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[54]), - libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[55]), - libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[56]), - libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[57]), - libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[58]), - libraryFilterMangasStartedType: reader.readLongOrNull(offsets[59]), - libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[60]), - libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[61]), - libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[62]), - libraryFilterNovelStartedType: reader.readLongOrNull(offsets[63]), - libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[64]), - libraryLocalSource: reader.readBoolOrNull(offsets[65]), - libraryShowCategoryTabs: reader.readBoolOrNull(offsets[66]), - libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[67]), - libraryShowLanguage: reader.readBoolOrNull(offsets[68]), - libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[69]), - mangaGridSize: reader.readLongOrNull(offsets[71]), + incognitoMode: reader.readBoolOrNull(offsets[49]), + libraryDownloadedChapters: reader.readBoolOrNull(offsets[50]), + libraryFilterAnimeBookMarkedType: reader.readLongOrNull(offsets[51]), + libraryFilterAnimeDownloadType: reader.readLongOrNull(offsets[52]), + libraryFilterAnimeStartedType: reader.readLongOrNull(offsets[53]), + libraryFilterAnimeUnreadType: reader.readLongOrNull(offsets[54]), + libraryFilterMangasBookMarkedType: reader.readLongOrNull(offsets[55]), + libraryFilterMangasDownloadType: reader.readLongOrNull(offsets[56]), + libraryFilterMangasStartedType: reader.readLongOrNull(offsets[57]), + libraryFilterMangasUnreadType: reader.readLongOrNull(offsets[58]), + libraryFilterNovelBookMarkedType: reader.readLongOrNull(offsets[59]), + libraryFilterNovelDownloadType: reader.readLongOrNull(offsets[60]), + libraryFilterNovelStartedType: reader.readLongOrNull(offsets[61]), + libraryFilterNovelUnreadType: reader.readLongOrNull(offsets[62]), + libraryLocalSource: reader.readBoolOrNull(offsets[63]), + libraryShowCategoryTabs: reader.readBoolOrNull(offsets[64]), + libraryShowContinueReadingButton: reader.readBoolOrNull(offsets[65]), + libraryShowLanguage: reader.readBoolOrNull(offsets[66]), + libraryShowNumbersOfItems: reader.readBoolOrNull(offsets[67]), + mangaGridSize: reader.readLongOrNull(offsets[69]), mangaHomeDisplayType: _SettingsmangaHomeDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[72])] ?? + reader.readByteOrNull(offsets[70])] ?? DisplayType.comfortableGrid, - markEpisodeAsSeenType: reader.readLongOrNull(offsets[73]), + markEpisodeAsSeenType: reader.readLongOrNull(offsets[71]), + navigationOrder: reader.readStringList(offsets[72]), novelDisplayType: _SettingsnovelDisplayTypeValueEnumMap[ - reader.readByteOrNull(offsets[74])] ?? + reader.readByteOrNull(offsets[73])] ?? DisplayType.comfortableGrid, - novelFontSize: reader.readLongOrNull(offsets[75]), - novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[77]), - novelLibraryLocalSource: reader.readBoolOrNull(offsets[78]), - novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[79]), - novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[80]), - novelLibraryShowLanguage: reader.readBoolOrNull(offsets[81]), - novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[82]), + novelFontSize: reader.readLongOrNull(offsets[74]), + novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[76]), + novelLibraryLocalSource: reader.readBoolOrNull(offsets[77]), + novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[78]), + novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[79]), + novelLibraryShowLanguage: reader.readBoolOrNull(offsets[80]), + novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[81]), novelTextAlign: _SettingsnovelTextAlignValueEnumMap[ - reader.readByteOrNull(offsets[83])] ?? + reader.readByteOrNull(offsets[82])] ?? NovelTextAlign.left, - onlyIncludePinnedSources: reader.readBoolOrNull(offsets[84]), - pagePreloadAmount: reader.readLongOrNull(offsets[85]), + onlyIncludePinnedSources: reader.readBoolOrNull(offsets[83]), + pagePreloadAmount: reader.readLongOrNull(offsets[84]), personalPageModeList: reader.readObjectList( - offsets[86], + offsets[85], PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), ), personalReaderModeList: reader.readObjectList( - offsets[87], + offsets[86], PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), ), playerSubtitleSettings: reader.readObjectOrNull( - offsets[88], + offsets[87], PlayerSubtitleSettingsSchema.deserialize, allOffsets, ), - pureBlackDarkMode: reader.readBoolOrNull(offsets[89]), - relativeTimesTamps: reader.readLongOrNull(offsets[90]), - saveAsCBZArchive: reader.readBoolOrNull(offsets[91]), + pureBlackDarkMode: reader.readBoolOrNull(offsets[88]), + relativeTimesTamps: reader.readLongOrNull(offsets[89]), + saveAsCBZArchive: reader.readBoolOrNull(offsets[90]), scaleType: - _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[92])] ?? + _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[91])] ?? ScaleType.fitScreen, - showPagesNumber: reader.readBoolOrNull(offsets[93]), + showPagesNumber: reader.readBoolOrNull(offsets[92]), sortChapterList: reader.readObjectList( - offsets[94], + offsets[93], SortChapterSchema.deserialize, allOffsets, SortChapter(), ), sortLibraryAnime: reader.readObjectOrNull( - offsets[95], + offsets[94], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryManga: reader.readObjectOrNull( - offsets[96], + offsets[95], SortLibraryMangaSchema.deserialize, allOffsets, ), sortLibraryNovel: reader.readObjectOrNull( - offsets[97], + offsets[96], SortLibraryMangaSchema.deserialize, allOffsets, ), - startDatebackup: reader.readLongOrNull(offsets[98]), - themeIsDark: reader.readBoolOrNull(offsets[99]), - updateProgressAfterReading: reader.readBoolOrNull(offsets[100]), - useLibass: reader.readBoolOrNull(offsets[101]), - usePageTapZones: reader.readBoolOrNull(offsets[102]), - userAgent: reader.readStringOrNull(offsets[103]), + startDatebackup: reader.readLongOrNull(offsets[97]), + themeIsDark: reader.readBoolOrNull(offsets[98]), + updateProgressAfterReading: reader.readBoolOrNull(offsets[99]), + useLibass: reader.readBoolOrNull(offsets[100]), + usePageTapZones: reader.readBoolOrNull(offsets[101]), + userAgent: reader.readStringOrNull(offsets[102]), ); object.chapterFilterBookmarkedList = reader.readObjectList( @@ -1259,11 +1276,11 @@ Settings _settingsDeserialize( FilterScanlator(), ); object.locale = reader.readObjectOrNull( - offsets[70], + offsets[68], L10nLocaleSchema.deserialize, allOffsets, ); - object.novelGridSize = reader.readLongOrNull(offsets[76]); + object.novelGridSize = reader.readLongOrNull(offsets[75]); return object; } @@ -1426,15 +1443,15 @@ P _settingsDeserializeProp

( case 47: return (reader.readBoolOrNull(offset)) as P; case 48: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readStringList(offset)) as P; case 49: return (reader.readBoolOrNull(offset)) as P; case 50: return (reader.readBoolOrNull(offset)) as P; case 51: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 52: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 53: return (reader.readLongOrNull(offset)) as P; case 54: @@ -1456,9 +1473,9 @@ P _settingsDeserializeProp

( case 62: return (reader.readLongOrNull(offset)) as P; case 63: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 64: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 65: return (reader.readBoolOrNull(offset)) as P; case 66: @@ -1466,31 +1483,31 @@ P _settingsDeserializeProp

( case 67: return (reader.readBoolOrNull(offset)) as P; case 68: - return (reader.readBoolOrNull(offset)) as P; - case 69: - return (reader.readBoolOrNull(offset)) as P; - case 70: return (reader.readObjectOrNull( offset, L10nLocaleSchema.deserialize, allOffsets, )) as P; - case 71: + case 69: return (reader.readLongOrNull(offset)) as P; - case 72: + case 70: return (_SettingsmangaHomeDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; - case 73: + case 71: return (reader.readLongOrNull(offset)) as P; - case 74: + case 72: + return (reader.readStringList(offset)) as P; + case 73: return (_SettingsnovelDisplayTypeValueEnumMap[ reader.readByteOrNull(offset)] ?? DisplayType.comfortableGrid) as P; + case 74: + return (reader.readLongOrNull(offset)) as P; case 75: return (reader.readLongOrNull(offset)) as P; case 76: - return (reader.readLongOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 77: return (reader.readBoolOrNull(offset)) as P; case 78: @@ -1502,53 +1519,57 @@ P _settingsDeserializeProp

( case 81: return (reader.readBoolOrNull(offset)) as P; case 82: - return (reader.readBoolOrNull(offset)) as P; - case 83: return (_SettingsnovelTextAlignValueEnumMap[ reader.readByteOrNull(offset)] ?? NovelTextAlign.left) as P; - case 84: + case 83: return (reader.readBoolOrNull(offset)) as P; - case 85: + case 84: return (reader.readLongOrNull(offset)) as P; - case 86: + case 85: return (reader.readObjectList( offset, PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), )) as P; - case 87: + case 86: return (reader.readObjectList( offset, PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), )) as P; - case 88: + case 87: return (reader.readObjectOrNull( offset, PlayerSubtitleSettingsSchema.deserialize, allOffsets, )) as P; + case 88: + return (reader.readBoolOrNull(offset)) as P; case 89: - return (reader.readBoolOrNull(offset)) as P; - case 90: return (reader.readLongOrNull(offset)) as P; - case 91: + case 90: return (reader.readBoolOrNull(offset)) as P; - case 92: + case 91: return (_SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offset)] ?? ScaleType.fitScreen) as P; - case 93: + case 92: return (reader.readBoolOrNull(offset)) as P; - case 94: + case 93: return (reader.readObjectList( offset, SortChapterSchema.deserialize, allOffsets, SortChapter(), )) as P; + case 94: + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 95: return (reader.readObjectOrNull( offset, @@ -1562,13 +1583,9 @@ P _settingsDeserializeProp

( allOffsets, )) as P; case 97: - return (reader.readObjectOrNull( - offset, - SortLibraryMangaSchema.deserialize, - allOffsets, - )) as P; - case 98: return (reader.readLongOrNull(offset)) as P; + case 98: + return (reader.readBoolOrNull(offset)) as P; case 99: return (reader.readBoolOrNull(offset)) as P; case 100: @@ -1576,8 +1593,6 @@ P _settingsDeserializeProp

( case 101: return (reader.readBoolOrNull(offset)) as P; case 102: - return (reader.readBoolOrNull(offset)) as P; - case 103: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -5180,81 +5195,243 @@ extension SettingsQueryFilter }); } - QueryBuilder hideAnimeIsNull() { + QueryBuilder hideItemsIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( - property: r'hideAnime', + property: r'hideItems', )); }); } - QueryBuilder hideAnimeIsNotNull() { + QueryBuilder hideItemsIsNotNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'hideAnime', + property: r'hideItems', )); }); } - QueryBuilder hideAnimeEqualTo( - bool? value) { + QueryBuilder + hideItemsElementEqualTo( + String value, { + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( - property: r'hideAnime', + property: r'hideItems', value: value, + caseSensitive: caseSensitive, )); }); } - QueryBuilder hideMangaIsNull() { + QueryBuilder + hideItemsElementGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'hideManga', + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'hideItems', + value: value, + caseSensitive: caseSensitive, )); }); } - QueryBuilder hideMangaIsNotNull() { + QueryBuilder + hideItemsElementLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'hideManga', + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'hideItems', + value: value, + caseSensitive: caseSensitive, )); }); } - QueryBuilder hideMangaEqualTo( - bool? value) { + QueryBuilder + hideItemsElementBetween( + 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'hideItems', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + hideItemsElementStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'hideItems', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + hideItemsElementEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'hideItems', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + hideItemsElementContains(String value, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'hideItems', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + hideItemsElementMatches(String pattern, {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'hideItems', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + hideItemsElementIsEmpty() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(FilterCondition.equalTo( - property: r'hideManga', - value: value, + property: r'hideItems', + value: '', )); }); } - QueryBuilder hideNovelIsNull() { + QueryBuilder + hideItemsElementIsNotEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNull( - property: r'hideNovel', + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'hideItems', + value: '', )); }); } - QueryBuilder hideNovelIsNotNull() { + QueryBuilder + hideItemsLengthEqualTo(int length) { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(const FilterCondition.isNotNull( - property: r'hideNovel', - )); + return query.listLength( + r'hideItems', + length, + true, + length, + true, + ); }); } - QueryBuilder hideNovelEqualTo( - bool? value) { + QueryBuilder hideItemsIsEmpty() { return QueryBuilder.apply(this, (query) { - return query.addFilterCondition(FilterCondition.equalTo( - property: r'hideNovel', - value: value, - )); + return query.listLength( + r'hideItems', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder + hideItemsIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'hideItems', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder + hideItemsLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'hideItems', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder + hideItemsLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'hideItems', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder + hideItemsLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'hideItems', + lower, + includeLower, + upper, + includeUpper, + ); }); } @@ -6628,6 +6805,251 @@ extension SettingsQueryFilter }); } + QueryBuilder + navigationOrderIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'navigationOrder', + )); + }); + } + + QueryBuilder + navigationOrderIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'navigationOrder', + )); + }); + } + + QueryBuilder + navigationOrderElementEqualTo( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'navigationOrder', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + navigationOrderElementGreaterThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'navigationOrder', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + navigationOrderElementLessThan( + String value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'navigationOrder', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + navigationOrderElementBetween( + 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'navigationOrder', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + navigationOrderElementStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'navigationOrder', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + navigationOrderElementEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'navigationOrder', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + navigationOrderElementContains(String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'navigationOrder', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + navigationOrderElementMatches(String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'navigationOrder', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder + navigationOrderElementIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'navigationOrder', + value: '', + )); + }); + } + + QueryBuilder + navigationOrderElementIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'navigationOrder', + value: '', + )); + }); + } + + QueryBuilder + navigationOrderLengthEqualTo(int length) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'navigationOrder', + length, + true, + length, + true, + ); + }); + } + + QueryBuilder + navigationOrderIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'navigationOrder', + 0, + true, + 0, + true, + ); + }); + } + + QueryBuilder + navigationOrderIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'navigationOrder', + 0, + false, + 999999, + true, + ); + }); + } + + QueryBuilder + navigationOrderLengthLessThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'navigationOrder', + 0, + true, + length, + include, + ); + }); + } + + QueryBuilder + navigationOrderLengthGreaterThan( + int length, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'navigationOrder', + length, + include, + 999999, + true, + ); + }); + } + + QueryBuilder + navigationOrderLengthBetween( + int lower, + int upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.listLength( + r'navigationOrder', + lower, + includeLower, + upper, + includeUpper, + ); + }); + } + QueryBuilder novelDisplayTypeEqualTo(DisplayType value) { return QueryBuilder.apply(this, (query) { @@ -8767,42 +9189,6 @@ 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); @@ -9895,42 +10281,6 @@ 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); @@ -10799,21 +11149,9 @@ extension SettingsQueryWhereDistinct }); } - QueryBuilder distinctByHideAnime() { + QueryBuilder distinctByHideItems() { 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'); + return query.addDistinctBy(r'hideItems'); }); } @@ -10966,6 +11304,12 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByNavigationOrder() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'navigationOrder'); + }); + } + QueryBuilder distinctByNovelDisplayType() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'novelDisplayType'); @@ -11444,21 +11788,9 @@ extension SettingsQueryProperty }); } - QueryBuilder hideAnimeProperty() { + QueryBuilder?, QQueryOperations> hideItemsProperty() { 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'); + return query.addPropertyName(r'hideItems'); }); } @@ -11619,6 +11951,13 @@ extension SettingsQueryProperty }); } + QueryBuilder?, QQueryOperations> + navigationOrderProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'navigationOrder'); + }); + } + QueryBuilder novelDisplayTypeProperty() { return QueryBuilder.apply(this, (query) { diff --git a/lib/modules/browse/browse_screen.dart b/lib/modules/browse/browse_screen.dart index fa6bda37..1ba17e3f 100644 --- a/lib/modules/browse/browse_screen.dart +++ b/lib/modules/browse/browse_screen.dart @@ -22,18 +22,16 @@ class BrowseScreen extends ConsumerStatefulWidget { class _BrowseScreenState extends ConsumerState with TickerProviderStateMixin { - late final hideManga = ref.watch(hideMangaStateProvider); - late final hideAnime = ref.watch(hideAnimeStateProvider); - late final hideNovel = ref.watch(hideNovelStateProvider); + late final hideItems = ref.watch(hideItemsStateProvider); late TabController _tabBarController; late final _tabList = [ - if (!hideManga) 'manga', - if (!hideAnime) 'anime', - if (!hideNovel) 'novel', - if (!hideManga) 'mangaExtension', - if (!hideAnime) 'animeExtension', - if (!hideNovel) 'novelExtension', + if (!hideItems.contains("/MangaLibrary")) 'manga', + if (!hideItems.contains("/AnimeLibrary")) 'anime', + if (!hideItems.contains("/NovelLibrary")) 'novel', + if (!hideItems.contains("/MangaLibrary")) 'mangaExtension', + if (!hideItems.contains("/AnimeLibrary")) 'animeExtension', + if (!hideItems.contains("/NovelLibrary")) 'novelExtension', ]; @override @@ -151,10 +149,10 @@ class _BrowseScreenState extends ConsumerState isScrollable: true, controller: _tabBarController, tabs: [ - if (!hideManga) Tab(text: l10n.manga_sources), - if (!hideAnime) Tab(text: l10n.anime_sources), - if (!hideNovel) Tab(text: l10n.novel_sources), - if (!hideManga) + if (!hideItems.contains("/MangaLibrary")) Tab(text: l10n.manga_sources), + if (!hideItems.contains("/AnimeLibrary")) Tab(text: l10n.anime_sources), + if (!hideItems.contains("/NovelLibrary")) Tab(text: l10n.novel_sources), + if (!hideItems.contains("/MangaLibrary")) Tab( child: Row( children: [ @@ -164,7 +162,7 @@ class _BrowseScreenState extends ConsumerState ], ), ), - if (!hideAnime) + if (!hideItems.contains("/AnimeLibrary")) Tab( child: Row( children: [ @@ -174,7 +172,7 @@ class _BrowseScreenState extends ConsumerState ], ), ), - if (!hideNovel) + if (!hideItems.contains("/NovelLibrary")) Tab( child: Row( children: [ @@ -187,34 +185,34 @@ class _BrowseScreenState extends ConsumerState ]), ), body: TabBarView(controller: _tabBarController, children: [ - if (!hideManga) + if (!hideItems.contains("/MangaLibrary")) SourcesScreen( itemType: ItemType.manga, tabIndex: (index) { _tabBarController.animateTo(index); }, ), - if (!hideAnime) + if (!hideItems.contains("/AnimeLibrary")) SourcesScreen( itemType: ItemType.anime, tabIndex: (index) { _tabBarController.animateTo(index); }, ), - if (!hideNovel) + if (!hideItems.contains("/NovelLibrary")) SourcesScreen( itemType: ItemType.novel, tabIndex: (index) { _tabBarController.animateTo(index); }, ), - if (!hideManga) + if (!hideItems.contains("/MangaLibrary")) ExtensionScreen( query: _textEditingController.text, itemType: ItemType.manga), - if (!hideAnime) + if (!hideItems.contains("/AnimeLibrary")) ExtensionScreen( query: _textEditingController.text, itemType: ItemType.anime), - if (!hideNovel) + if (!hideItems.contains("/NovelLibrary")) ExtensionScreen( query: _textEditingController.text, itemType: ItemType.novel), ]), diff --git a/lib/modules/history/history_screen.dart b/lib/modules/history/history_screen.dart index ea39b7f5..265822a3 100644 --- a/lib/modules/history/history_screen.dart +++ b/lib/modules/history/history_screen.dart @@ -54,13 +54,11 @@ class _HistoryScreenState 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); + final hideItems = ref.watch(hideItemsStateProvider); - if (!hideManga) newTabs++; - if (!hideAnime) newTabs++; - if (!hideNovel) newTabs++; + if (!hideItems.contains("/MangaLibrary")) newTabs++; + if (!hideItems.contains("/AnimeLibrary")) newTabs++; + if (!hideItems.contains("/NovelLibrary")) newTabs++; if (newTabs == 0) { return SizedBox.shrink(); } @@ -147,14 +145,17 @@ class _HistoryScreenState extends ConsumerState .itemTypeEqualTo(_tabBarController .index == 0 && - !hideManga + !hideItems.contains( + "/MangaLibrary") ? ItemType.manga : _tabBarController.index == 1 - - (hideManga + (hideItems.contains( + "/MangaLibrary") ? 1 : 0) && - !hideAnime + !hideItems.contains( + "/AnimeLibrary") ? ItemType.anime : ItemType.novel))) .findAllSync() @@ -182,26 +183,26 @@ class _HistoryScreenState extends ConsumerState indicatorSize: TabBarIndicatorSize.tab, controller: _tabBarController, tabs: [ - if (!hideManga) Tab(text: l10n.manga), - if (!hideAnime) Tab(text: l10n.anime), - if (!hideNovel) Tab(text: l10n.novel), + if (!hideItems.contains("/MangaLibrary")) Tab(text: l10n.manga), + if (!hideItems.contains("/AnimeLibrary")) Tab(text: l10n.anime), + if (!hideItems.contains("/NovelLibrary")) Tab(text: l10n.novel), ], ), ), body: Padding( padding: const EdgeInsets.only(top: 10), child: TabBarView(controller: _tabBarController, children: [ - if (!hideManga) + if (!hideItems.contains("/MangaLibrary")) HistoryTab( itemType: ItemType.manga, query: _textEditingController.text, ), - if (!hideAnime) + if (!hideItems.contains("/AnimeLibrary")) HistoryTab( itemType: ItemType.anime, query: _textEditingController.text, ), - if (!hideNovel) + if (!hideItems.contains("/NovelLibrary")) 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 3e907a2e..5a33df84 100644 --- a/lib/modules/main_view/main_screen.dart +++ b/lib/modules/main_view/main_screen.dart @@ -51,18 +51,10 @@ class _MainScreenState extends ConsumerState { } } - late bool hideManga = ref.watch(hideMangaStateProvider); - late bool hideAnime = ref.watch(hideAnimeStateProvider); - late bool hideNovel = ref.watch(hideNovelStateProvider); + late final navigationOrder = ref.watch(navigationOrderStateProvider); late String? location = ref.watch(routerCurrentLocationStateProvider(context)); - late String defaultLocation = hideManga - ? hideAnime - ? hideNovel - ? '/more' - : '/NovelLibrary' - : '/AnimeLibrary' - : '/MangaLibrary'; + late String defaultLocation = navigationOrder.first; @override initState() { WidgetsBinding.instance.addPostFrameCallback((_) { @@ -84,33 +76,17 @@ class _MainScreenState extends ConsumerState { Widget build(BuildContext context) { final l10n = context.l10n; final route = GoRouter.of(context); + final navigationOrder = ref.watch(navigationOrderStateProvider); + final hideItems = ref.watch(hideItemsStateProvider); location = ref.watch(routerCurrentLocationStateProvider(context)); return ref.watch(migrationProvider).when(data: (_) { return Consumer(builder: (context, ref, chuld) { - hideManga = ref.watch(hideMangaStateProvider); - hideAnime = ref.watch(hideAnimeStateProvider); - 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"); - } + final dest = + navigationOrder.where((nav) => !hideItems.contains(nav)).toList(); + int currentIndex = dest.indexOf(location ?? defaultLocation); if (currentIndex == -1) { currentIndex = dest.length - 1; @@ -183,91 +159,9 @@ class _MainScreenState extends ConsumerState { return NavigationRail( 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: _updatesTotalNumbers( - ref, Icon(Icons.new_releases)), - icon: _updatesTotalNumbers( - ref, - Icon(Icons - .new_releases_outlined)), - label: Padding( - padding: - const EdgeInsets.only(top: 5), - child: Text( - getHyphenatedUpdatesLabel( - ref - .watch( - l10nLocaleStateProvider) - .languageCode, - l10n.updates, - ), - textAlign: TextAlign.center, - ), - )), - NavigationRailDestination( - selectedIcon: - const Icon(Icons.history), - icon: const Icon( - Icons.history_outlined), - label: Padding( - padding: const EdgeInsets.only( - top: 5), - child: Text(l10n.history))), - NavigationRailDestination( - selectedIcon: - _extensionUpdateTotalNumbers( - ref, Icon(Icons.explore)), - icon: _extensionUpdateTotalNumbers( - ref, - Icon(Icons.explore_outlined)), - label: Padding( - padding: const EdgeInsets.only( - top: 5), - child: Text(l10n.browse))), - NavigationRailDestination( - selectedIcon: - const Icon(Icons.more_horiz), - icon: const Icon( - Icons.more_horiz_outlined), - label: Padding( - padding: const EdgeInsets.only( - top: 5), - child: Text(l10n.more))), - ], + destinations: + _buildNavigationWidgetsDesktop( + ref, dest, context), selectedIndex: currentIndex, onDestinationSelected: (newIndex) { route.go(dest[newIndex]); @@ -313,49 +207,8 @@ class _MainScreenState extends ConsumerState { animationDuration: 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: _updatesTotalNumbers( - ref, Icon(Icons.new_releases)), - icon: _updatesTotalNumbers( - ref, Icon(Icons.new_releases_outlined)), - label: l10n.updates), - NavigationDestination( - selectedIcon: const Icon(Icons.history), - icon: const Icon(Icons.history_outlined), - label: l10n.history), - NavigationDestination( - selectedIcon: _extensionUpdateTotalNumbers( - ref, Icon(Icons.explore)), - icon: _extensionUpdateTotalNumbers( - ref, Icon(Icons.explore_outlined)), - label: l10n.browse), - NavigationDestination( - selectedIcon: const Icon(Icons.more_horiz), - icon: const Icon(Icons.more_horiz_outlined), - label: l10n.more), - ], + destinations: _buildNavigationWidgetsMobile( + ref, dest, context), onDestinationSelected: (newIndex) { route.go(dest[newIndex]); }, @@ -373,18 +226,136 @@ class _MainScreenState extends ConsumerState { return const LoadingIcon(); }); } + + List _buildNavigationWidgetsDesktop( + WidgetRef ref, List dest, BuildContext context) { + final l10n = context.l10n; + final destinations = + List.filled(dest.length, null); + if (dest.contains("/MangaLibrary")) { + destinations[dest.indexOf("/MangaLibrary")] = 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 (dest.contains("/AnimeLibrary")) { + destinations[dest.indexOf("/AnimeLibrary")] = 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 (dest.contains("/NovelLibrary")) { + destinations[dest.indexOf("/NovelLibrary")] = 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))); + } + if (dest.contains("/updates")) { + destinations[dest.indexOf("/updates")] = NavigationRailDestination( + selectedIcon: _updatesTotalNumbers(ref, Icon(Icons.new_releases)), + icon: _updatesTotalNumbers(ref, Icon(Icons.new_releases_outlined)), + label: Padding( + padding: const EdgeInsets.only(top: 5), + child: Text( + getHyphenatedUpdatesLabel( + ref.watch(l10nLocaleStateProvider).languageCode, + l10n.updates, + ), + textAlign: TextAlign.center, + ), + )); + } + if (dest.contains("/history")) { + destinations[dest.indexOf("/history")] = NavigationRailDestination( + selectedIcon: const Icon(Icons.history), + icon: const Icon(Icons.history_outlined), + label: Padding( + padding: const EdgeInsets.only(top: 5), + child: Text(l10n.history))); + } + if (dest.contains("/browse")) { + destinations[dest.indexOf("/browse")] = NavigationRailDestination( + selectedIcon: _extensionUpdateTotalNumbers(ref, Icon(Icons.explore)), + icon: _extensionUpdateTotalNumbers(ref, Icon(Icons.explore_outlined)), + label: Padding( + padding: const EdgeInsets.only(top: 5), + child: Text(l10n.browse))); + } + if (dest.contains("/more")) { + destinations[dest.indexOf("/more")] = NavigationRailDestination( + selectedIcon: const Icon(Icons.more_horiz), + icon: const Icon(Icons.more_horiz_outlined), + label: Padding( + padding: const EdgeInsets.only(top: 5), child: Text(l10n.more))); + } + return destinations.nonNulls.toList(); + } + + List _buildNavigationWidgetsMobile( + WidgetRef ref, List dest, BuildContext context) { + final l10n = context.l10n; + final destinations = + List.filled(dest.length, const SizedBox.shrink()); + if (dest.contains("/MangaLibrary")) { + destinations[dest.indexOf("/MangaLibrary")] = NavigationDestination( + selectedIcon: const Icon(Icons.collections_bookmark), + icon: const Icon(Icons.collections_bookmark_outlined), + label: l10n.manga); + } + if (dest.contains("/AnimeLibrary")) { + destinations[dest.indexOf("/AnimeLibrary")] = NavigationDestination( + selectedIcon: const Icon(Icons.video_collection), + icon: const Icon(Icons.video_collection_outlined), + label: l10n.anime); + } + if (dest.contains("/NovelLibrary")) { + destinations[dest.indexOf("/NovelLibrary")] = NavigationDestination( + selectedIcon: const Icon(Icons.local_library), + icon: const Icon(Icons.local_library_outlined), + label: l10n.novel); + } + if (dest.contains("/updates")) { + destinations[dest.indexOf("/updates")] = NavigationDestination( + selectedIcon: _updatesTotalNumbers(ref, Icon(Icons.new_releases)), + icon: _updatesTotalNumbers(ref, Icon(Icons.new_releases_outlined)), + label: l10n.updates); + } + if (dest.contains("/history")) { + destinations[dest.indexOf("/history")] = NavigationDestination( + selectedIcon: const Icon(Icons.history), + icon: const Icon(Icons.history_outlined), + label: l10n.history); + } + if (dest.contains("/browse")) { + destinations[dest.indexOf("/browse")] = NavigationDestination( + selectedIcon: _extensionUpdateTotalNumbers(ref, Icon(Icons.explore)), + icon: _extensionUpdateTotalNumbers(ref, Icon(Icons.explore_outlined)), + label: l10n.browse); + } + if (dest.contains("/more")) { + destinations[dest.indexOf("/more")] = NavigationDestination( + selectedIcon: const Icon(Icons.more_horiz), + icon: const Icon(Icons.more_horiz_outlined), + label: l10n.more); + } + return destinations; + } } Widget _extensionUpdateTotalNumbers(WidgetRef ref, Widget widget) { + final hideItems = ref.watch(hideItemsStateProvider); return StreamBuilder( stream: isar.sources .filter() .idIsNotNull() - .optional(ref.watch(hideMangaStateProvider), + .optional(hideItems.contains("/MangaLibrary"), (q) => q.not().itemTypeEqualTo(ItemType.manga)) - .optional(ref.watch(hideAnimeStateProvider), + .optional(hideItems.contains("/AnimeLibrary"), (q) => q.not().itemTypeEqualTo(ItemType.anime)) - .optional(ref.watch(hideNovelStateProvider), + .optional(hideItems.contains("/NovelLibrary"), (q) => q.not().itemTypeEqualTo(ItemType.novel)) .and() .isActiveEqualTo(true) @@ -405,24 +376,25 @@ Widget _extensionUpdateTotalNumbers(WidgetRef ref, Widget widget) { } Widget _updatesTotalNumbers(WidgetRef ref, Widget widget) { + final hideItems = ref.watch(hideItemsStateProvider); return StreamBuilder( stream: isar.updates .filter() .idIsNotNull() .optional( - ref.watch(hideMangaStateProvider), + hideItems.contains("/MangaLibrary"), (q) => q.chapter( (c) => c.manga((m) => m.not().itemTypeEqualTo(ItemType.manga)), )) .optional( - ref.watch(hideAnimeStateProvider), + hideItems.contains("/AnimeLibrary"), (q) => q.chapter( (c) => c.manga((m) => m.not().itemTypeEqualTo(ItemType.anime)), )) .optional( - ref.watch(hideNovelStateProvider), + hideItems.contains("/NovelLibrary"), (q) => q.chapter( (c) => c.manga((m) => m.not().itemTypeEqualTo(ItemType.novel)), diff --git a/lib/modules/more/categories/categories_screen.dart b/lib/modules/more/categories/categories_screen.dart index d354f527..dc0e3c46 100644 --- a/lib/modules/more/categories/categories_screen.dart +++ b/lib/modules/more/categories/categories_screen.dart @@ -32,12 +32,10 @@ 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++; + final hideItems = ref.watch(hideItemsStateProvider); + if (!hideItems.contains("/MangaLibrary")) newTabs++; + if (!hideItems.contains("/AnimeLibrary")) newTabs++; + if (!hideItems.contains("/NovelLibrary")) newTabs++; if (tabs != newTabs) { _tabBarController.dispose(); _tabBarController = TabController(length: newTabs, vsync: this); @@ -62,22 +60,22 @@ class _CategoriesScreenState extends ConsumerState indicatorSize: TabBarIndicatorSize.tab, controller: _tabBarController, tabs: [ - if (!hideManga) Tab(text: l10n.manga), - if (!hideAnime) Tab(text: l10n.anime), - if (!hideNovel) Tab(text: l10n.novel), + if (!hideItems.contains("/MangaLibrary")) Tab(text: l10n.manga), + if (!hideItems.contains("/AnimeLibrary")) Tab(text: l10n.anime), + if (!hideItems.contains("/NovelLibrary")) Tab(text: l10n.novel), ], ), ), body: TabBarView(controller: _tabBarController, children: [ - if (!hideManga) + if (!hideItems.contains("/MangaLibrary")) CategoriesTab( itemType: ItemType.manga, ), - if (!hideAnime) + if (!hideItems.contains("/AnimeLibrary")) CategoriesTab( itemType: ItemType.anime, ), - if (!hideNovel) + if (!hideItems.contains("/NovelLibrary")) CategoriesTab( itemType: ItemType.novel, ) diff --git a/lib/modules/more/settings/appearance/appearance_screen.dart b/lib/modules/more/settings/appearance/appearance_screen.dart index 4cd7d56d..7719b5a6 100644 --- a/lib/modules/more/settings/appearance/appearance_screen.dart +++ b/lib/modules/more/settings/appearance/appearance_screen.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; +import 'package:go_router/go_router.dart'; import 'package:google_fonts/google_fonts.dart'; import 'package:mangayomi/modules/more/settings/appearance/providers/app_font_family.dart'; import 'package:mangayomi/modules/more/settings/appearance/providers/theme_mode_state_provider.dart'; @@ -16,6 +17,16 @@ import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:mangayomi/utils/language.dart'; import 'package:super_sliver_list/super_sliver_list.dart'; +final navigationItems = { + "/MangaLibrary": "Manga", + "/AnimeLibrary": "Anime", + "/NovelLibrary": "Novel", + "/updates": "updates", + "/history": "history", + "/browse": "Browse", + "/more": "More", +}; + class AppearanceScreen extends ConsumerWidget { const AppearanceScreen({super.key}); @@ -28,9 +39,6 @@ class AppearanceScreen extends ConsumerWidget { final isDarkTheme = ref.watch(themeModeStateProvider); final l10nLocale = ref.watch(l10nLocaleStateProvider); final appFontFamily = ref.watch(appFontFamilyProvider); - final hideAnime = ref.watch(hideAnimeStateProvider); - final hideManga = ref.watch(hideMangaStateProvider); - final hideNovel = ref.watch(hideNovelStateProvider); final appFontFamilySub = appFontFamily == null ? context.l10n.default0 : GoogleFonts.asMap() @@ -300,80 +308,15 @@ class AppearanceScreen extends ConsumerWidget { ), ), ListTile( - onTap: () { - showDialog( - context: context, - builder: (context) { - return AlertDialog( - title: Text( - l10n.reorder_navigation, - ), - content: SizedBox( - width: context.width(0.8), - child: ReorderableListView.builder( - shrinkWrap: true, - itemCount: 7, - itemBuilder: (context, index) { - final locale = AppLocalizations - .supportedLocales[index]; - return RadioListTile( - dense: true, - contentPadding: const EdgeInsets.all(0), - value: locale, - groupValue: l10nLocale, - onChanged: (value) { - ref - .read(l10nLocaleStateProvider - .notifier) - .setLocale(locale); - Navigator.pop(context); - }, - title: Text(completeLanguageName( - locale.toLanguageTag())), - ); - }, - onReorder: (oldIndex, newIndex) { - }, - )), - actions: [ - Row( - mainAxisAlignment: MainAxisAlignment.end, - children: [ - TextButton( - onPressed: () async { - Navigator.pop(context); - }, - child: Text( - l10n.cancel, - style: TextStyle( - color: context.primaryColor), - )), - ], - ) - ], - ); - }); - }, - title: Text(l10n.reorder_navigation), - ), - SwitchListTile( - value: hideAnime, - title: Text(context.l10n.hide_anime), - onChanged: (value) { - ref.read(hideAnimeStateProvider.notifier).set(value); - }), - 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); - }), + onTap: () { + context.push("/customNavigationSettings"); + }, + title: Text(l10n.reorder_navigation), + subtitle: Text( + l10n.reorder_navigation_description, + style: TextStyle( + fontSize: 11, color: context.secondaryColor), + )), ], ), ), @@ -526,3 +469,72 @@ class AppearanceScreen extends ConsumerWidget { ); } } + +class CustomNavigationSettings extends ConsumerStatefulWidget { + const CustomNavigationSettings({super.key}); + + @override + ConsumerState createState() => + _CustomNavigationSettingsState(); +} + +class _CustomNavigationSettingsState + extends ConsumerState { + @override + Widget build(BuildContext context) { + final l10n = l10nLocalizations(context); + final navigationOrder = ref.watch(navigationOrderStateProvider); + final hideItems = ref.watch(hideItemsStateProvider); + return Scaffold( + appBar: AppBar( + title: Text(l10n!.reorder_navigation), + ), + body: SingleChildScrollView( + child: Padding( + padding: const EdgeInsets.symmetric(horizontal: 20), + child: ReorderableListView.builder( + shrinkWrap: true, + itemCount: navigationOrder.length, + itemBuilder: (context, index) { + final navigation = navigationOrder[index]; + return SwitchListTile.adaptive( + key: Key(navigation), + dense: true, + contentPadding: const EdgeInsets.only(left: 0, right: 40), + value: hideItems.contains(navigation), + onChanged: navigation == "/more" + ? null + : (value) { + final temp = hideItems.toList(); + if (value && !hideItems.contains(navigation)) { + temp.add(navigation); + } else { + temp.remove(navigation); + } + ref.read(hideItemsStateProvider.notifier).set(temp); + }, + title: Text(navigationItems[navigation]!), + ); + }, + onReorder: (oldIndex, newIndex) { + if (oldIndex < newIndex) { + final draggedItem = navigationOrder[oldIndex]; + for (var i = oldIndex; i < newIndex - 1; i++) { + navigationOrder[i] = navigationOrder[i + 1]; + } + navigationOrder[newIndex - 1] = draggedItem; + } else { + final draggedItem = navigationOrder[oldIndex]; + for (var i = oldIndex; i > newIndex; i--) { + navigationOrder[i] = navigationOrder[i - 1]; + } + navigationOrder[newIndex] = draggedItem; + } + ref.read(navigationOrderStateProvider.notifier).set(navigationOrder); + }, + ), + ), + ), + ); + } +} 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 09316bde..4931afb0 100644 --- a/lib/modules/more/settings/reader/providers/reader_state_provider.dart +++ b/lib/modules/more/settings/reader/providers/reader_state_provider.dart @@ -139,47 +139,41 @@ class FullScreenReaderState extends _$FullScreenReaderState { } @riverpod -class HideMangaState extends _$HideMangaState { +class NavigationOrderState extends _$NavigationOrderState { @override - bool build() { - return isar.settings.getSync(227)!.hideManga ?? false; + List build() { + return isar.settings.getSync(227)!.navigationOrder ?? + [ + '/MangaLibrary', + '/AnimeLibrary', + '/NovelLibrary', + '/updates', + '/history', + '/browse', + '/more' + ]; } - void set(bool value) { + void set(List values) { final settings = isar.settings.getSync(227); - state = value; + state = values; isar.writeTxnSync( - () => isar.settings.putSync(settings!..hideManga = value)); + () => isar.settings.putSync(settings!..navigationOrder = values)); } } @riverpod -class HideAnimeState extends _$HideAnimeState { +class HideItemsState extends _$HideItemsState { @override - bool build() { - return isar.settings.getSync(227)!.hideAnime ?? false; + List build() { + return isar.settings.getSync(227)!.hideItems ?? []; } - void set(bool value) { + void set(List values) { final settings = isar.settings.getSync(227); - state = value; + state = values; 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)); + () => isar.settings.putSync(settings!..hideItems = values)); } } 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 0c5634d5..3b672a06 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,54 +157,39 @@ final fullScreenReaderStateProvider = ); typedef _$FullScreenReaderState = AutoDisposeNotifier; -String _$hideMangaStateHash() => r'fd24207581798fd1634ff6df2c85b8895053d14c'; +String _$navigationOrderStateHash() => + r'f1da55a7687995d136a6580d3f63f9b1b32a6ae8'; -/// See also [HideMangaState]. -@ProviderFor(HideMangaState) -final hideMangaStateProvider = - AutoDisposeNotifierProvider.internal( - HideMangaState.new, - name: r'hideMangaStateProvider', +/// See also [NavigationOrderState]. +@ProviderFor(NavigationOrderState) +final navigationOrderStateProvider = + AutoDisposeNotifierProvider>.internal( + NavigationOrderState.new, + name: r'navigationOrderStateProvider', debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') ? null - : _$hideMangaStateHash, + : _$navigationOrderStateHash, dependencies: null, allTransitiveDependencies: null, ); -typedef _$HideMangaState = AutoDisposeNotifier; -String _$hideAnimeStateHash() => r'3e8748d9312b9ea84364959b7de17fed2204d303'; +typedef _$NavigationOrderState = AutoDisposeNotifier>; +String _$hideItemsStateHash() => r'b4a467e66f6a1f9b36e4b201a10b771e0dae6a80'; -/// See also [HideAnimeState]. -@ProviderFor(HideAnimeState) -final hideAnimeStateProvider = - AutoDisposeNotifierProvider.internal( - HideAnimeState.new, - name: r'hideAnimeStateProvider', +/// See also [HideItemsState]. +@ProviderFor(HideItemsState) +final hideItemsStateProvider = + AutoDisposeNotifierProvider>.internal( + HideItemsState.new, + name: r'hideItemsStateProvider', debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') ? null - : _$hideAnimeStateHash, + : _$hideItemsStateHash, 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; +typedef _$HideItemsState = AutoDisposeNotifier>; String _$novelFontSizeStateHash() => r'fd104e358203d3f86e14d933518f2dbd067cec13'; diff --git a/lib/modules/updates/updates_screen.dart b/lib/modules/updates/updates_screen.dart index 7c859ab8..b0e32390 100644 --- a/lib/modules/updates/updates_screen.dart +++ b/lib/modules/updates/updates_screen.dart @@ -95,12 +95,10 @@ class _UpdatesScreenState 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++; + final hideItems = ref.watch(hideItemsStateProvider); + if (!hideItems.contains("/MangaLibrary")) newTabs++; + if (!hideItems.contains("/AnimeLibrary")) newTabs++; + if (!hideItems.contains("/NovelLibrary")) newTabs++; if (newTabs == 0) { return SizedBox.shrink(); } @@ -194,14 +192,17 @@ class _UpdatesScreenState extends ConsumerState .itemTypeEqualTo(_tabBarController .index == 0 && - !hideManga + !hideItems.contains( + "/MangaLibrary") ? ItemType.manga : _tabBarController.index == 1 - - (hideManga + (hideItems.contains( + "/MangaLibrary") ? 1 : 0) && - !hideAnime + !hideItems.contains( + "/AnimeLibrary") ? ItemType.anime : ItemType.novel))) .findAllSync() @@ -229,7 +230,7 @@ class _UpdatesScreenState extends ConsumerState indicatorSize: TabBarIndicatorSize.tab, controller: _tabBarController, tabs: [ - if (!hideManga) + if (!hideItems.contains("/MangaLibrary")) Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -238,7 +239,7 @@ class _UpdatesScreenState extends ConsumerState _updateNumbers(ref, ItemType.manga) ], ), - if (!hideAnime) + if (!hideItems.contains("/AnimeLibrary")) Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -247,7 +248,7 @@ class _UpdatesScreenState extends ConsumerState _updateNumbers(ref, ItemType.anime) ], ), - if (!hideNovel) + if (!hideItems.contains("/NovelLibrary")) Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -262,17 +263,17 @@ class _UpdatesScreenState extends ConsumerState body: Padding( padding: const EdgeInsets.only(top: 10), child: TabBarView(controller: _tabBarController, children: [ - if (!hideManga) + if (!hideItems.contains("/MangaLibrary")) UpdateTab( itemType: ItemType.manga, query: _textEditingController.text, isLoading: _isLoading), - if (!hideAnime) + if (!hideItems.contains("/AnimeLibrary")) UpdateTab( itemType: ItemType.anime, query: _textEditingController.text, isLoading: _isLoading), - if (!hideNovel) + if (!hideItems.contains("/NovelLibrary")) UpdateTab( itemType: ItemType.novel, query: _textEditingController.text, diff --git a/lib/router/router.dart b/lib/router/router.dart index 46e1c31a..53a716bb 100644 --- a/lib/router/router.dart +++ b/lib/router/router.dart @@ -594,6 +594,19 @@ class RouterNotifier extends ChangeNotifier { ); }, ), + GoRoute( + path: "/customNavigationSettings", + name: "customNavigationSettings", + builder: (context, state) { + return const CustomNavigationSettings(); + }, + pageBuilder: (context, state) { + return transitionPage( + key: state.pageKey, + child: const CustomNavigationSettings(), + ); + }, + ), ]; } diff --git a/lib/services/aniskip.g.dart b/lib/services/aniskip.g.dart index b2e1defb..c05db920 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 558da2c4..834afd64 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'70e8cd537270a9054a1ef72de117fc7ad5545218'; +String _$anilistHash() => r'ddd07acc8d28d2aa95c942566109e9393ca9e5ed'; /// Copied from Dart SDK class _SystemHash {