From 7214689072953380a718e25afd6561775168854e Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Thu, 26 Dec 2024 23:41:21 +0100 Subject: [PATCH 1/3] add bottom bar to adjust font size --- lib/models/settings.dart | 16 + lib/models/settings.g.dart | 461 +++++++++++++----- .../providers/reader_state_provider.dart | 30 ++ .../providers/reader_state_provider.g.dart | 34 ++ lib/modules/novel/novel_reader_view.dart | 333 ++++++++++--- 5 files changed, 680 insertions(+), 194 deletions(-) diff --git a/lib/models/settings.dart b/lib/models/settings.dart index 4198efc..3263375 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -215,6 +215,11 @@ class Settings { @enumerated late DisplayType novelDisplayType; + int? novelFontSize; + + @enumerated + late NovelTextAlign novelTextAlign; + bool? hideManga; bool? hideAnime; @@ -316,6 +321,8 @@ class Settings { this.novelLibraryLocalSource, this.sortLibraryNovel, this.novelDisplayType = DisplayType.comfortableGrid, + this.novelFontSize = 14, + this.novelTextAlign = NovelTextAlign.left, this.hideManga = false, this.hideAnime = false, this.hideNovel = false}); @@ -488,6 +495,11 @@ class Settings { : null; novelDisplayType = DisplayType .values[json['novelDisplayType'] ?? DisplayType.comfortableGrid.index]; + if (json['novelFontSize'] != null) { + novelFontSize = json['novelFontSize']; + } + novelTextAlign = NovelTextAlign + .values[json['novelTextAlign'] ?? NovelTextAlign.left.index]; hideManga = json['hideManga']; hideAnime = json['hideAnime']; hideNovel = json['hideNovel']; @@ -603,6 +615,8 @@ class Settings { 'novelLibraryLocalSource': novelLibraryLocalSource, 'sortLibraryNovel': sortLibraryNovel?.toJson(), 'novelDisplayType': novelDisplayType.index, + 'novelFontSize': novelFontSize, + 'novelTextAlign': novelTextAlign.index, 'hideManga': hideManga, 'hideAnime': hideAnime, 'hideNovel': hideNovel @@ -804,6 +818,8 @@ enum ReaderMode { horizontalContinuous } +enum NovelTextAlign { left, center, right, block } + enum PageMode { onePage, doublePage } @embedded diff --git a/lib/models/settings.g.dart b/lib/models/settings.g.dart index 62a3670..5af0c10 100644 --- a/lib/models/settings.g.dart +++ b/lib/models/settings.g.dart @@ -405,146 +405,157 @@ const SettingsSchema = CollectionSchema( type: IsarType.byte, enumMap: _SettingsnovelDisplayTypeEnumValueMap, ), - r'novelGridSize': PropertySchema( + r'novelFontSize': PropertySchema( id: 74, + name: r'novelFontSize', + type: IsarType.long, + ), + r'novelGridSize': PropertySchema( + id: 75, name: r'novelGridSize', type: IsarType.long, ), r'novelLibraryDownloadedChapters': PropertySchema( - id: 75, + id: 76, name: r'novelLibraryDownloadedChapters', type: IsarType.bool, ), r'novelLibraryLocalSource': PropertySchema( - id: 76, + id: 77, name: r'novelLibraryLocalSource', type: IsarType.bool, ), r'novelLibraryShowCategoryTabs': PropertySchema( - id: 77, + id: 78, name: r'novelLibraryShowCategoryTabs', type: IsarType.bool, ), r'novelLibraryShowContinueReadingButton': PropertySchema( - id: 78, + id: 79, name: r'novelLibraryShowContinueReadingButton', type: IsarType.bool, ), r'novelLibraryShowLanguage': PropertySchema( - id: 79, + id: 80, name: r'novelLibraryShowLanguage', type: IsarType.bool, ), r'novelLibraryShowNumbersOfItems': PropertySchema( - id: 80, + id: 81, name: r'novelLibraryShowNumbersOfItems', type: IsarType.bool, ), + r'novelTextAlign': PropertySchema( + id: 82, + name: r'novelTextAlign', + type: IsarType.byte, + enumMap: _SettingsnovelTextAlignEnumValueMap, + ), r'onlyIncludePinnedSources': PropertySchema( - id: 81, + id: 83, name: r'onlyIncludePinnedSources', type: IsarType.bool, ), r'pagePreloadAmount': PropertySchema( - id: 82, + id: 84, name: r'pagePreloadAmount', type: IsarType.long, ), r'personalPageModeList': PropertySchema( - id: 83, + id: 85, name: r'personalPageModeList', type: IsarType.objectList, target: r'PersonalPageMode', ), r'personalReaderModeList': PropertySchema( - id: 84, + id: 86, name: r'personalReaderModeList', type: IsarType.objectList, target: r'PersonalReaderMode', ), r'playerSubtitleSettings': PropertySchema( - id: 85, + id: 87, name: r'playerSubtitleSettings', type: IsarType.object, target: r'PlayerSubtitleSettings', ), r'pureBlackDarkMode': PropertySchema( - id: 86, + id: 88, name: r'pureBlackDarkMode', type: IsarType.bool, ), r'relativeTimesTamps': PropertySchema( - id: 87, + id: 89, name: r'relativeTimesTamps', type: IsarType.long, ), r'saveAsCBZArchive': PropertySchema( - id: 88, + id: 90, name: r'saveAsCBZArchive', type: IsarType.bool, ), r'scaleType': PropertySchema( - id: 89, + id: 91, name: r'scaleType', type: IsarType.byte, enumMap: _SettingsscaleTypeEnumValueMap, ), r'showPagesNumber': PropertySchema( - id: 90, + id: 92, name: r'showPagesNumber', type: IsarType.bool, ), r'sortChapterList': PropertySchema( - id: 91, + id: 93, name: r'sortChapterList', type: IsarType.objectList, target: r'SortChapter', ), r'sortLibraryAnime': PropertySchema( - id: 92, + id: 94, name: r'sortLibraryAnime', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryManga': PropertySchema( - id: 93, + id: 95, name: r'sortLibraryManga', type: IsarType.object, target: r'SortLibraryManga', ), r'sortLibraryNovel': PropertySchema( - id: 94, + id: 96, name: r'sortLibraryNovel', type: IsarType.object, target: r'SortLibraryManga', ), r'startDatebackup': PropertySchema( - id: 95, + id: 97, name: r'startDatebackup', type: IsarType.long, ), r'themeIsDark': PropertySchema( - id: 96, + id: 98, name: r'themeIsDark', type: IsarType.bool, ), r'updateProgressAfterReading': PropertySchema( - id: 97, + id: 99, name: r'updateProgressAfterReading', type: IsarType.bool, ), r'useLibass': PropertySchema( - id: 98, + id: 100, name: r'useLibass', type: IsarType.bool, ), r'usePageTapZones': PropertySchema( - id: 99, + id: 101, name: r'usePageTapZones', type: IsarType.bool, ), r'userAgent': PropertySchema( - id: 100, + id: 102, name: r'userAgent', type: IsarType.string, ) @@ -968,68 +979,70 @@ void _settingsSerialize( writer.writeByte(offsets[71], object.mangaHomeDisplayType.index); writer.writeLong(offsets[72], object.markEpisodeAsSeenType); writer.writeByte(offsets[73], object.novelDisplayType.index); - writer.writeLong(offsets[74], object.novelGridSize); - writer.writeBool(offsets[75], object.novelLibraryDownloadedChapters); - writer.writeBool(offsets[76], object.novelLibraryLocalSource); - writer.writeBool(offsets[77], object.novelLibraryShowCategoryTabs); - writer.writeBool(offsets[78], object.novelLibraryShowContinueReadingButton); - writer.writeBool(offsets[79], object.novelLibraryShowLanguage); - writer.writeBool(offsets[80], object.novelLibraryShowNumbersOfItems); - writer.writeBool(offsets[81], object.onlyIncludePinnedSources); - writer.writeLong(offsets[82], object.pagePreloadAmount); + writer.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[83], + offsets[85], allOffsets, PersonalPageModeSchema.serialize, object.personalPageModeList, ); writer.writeObjectList( - offsets[84], + offsets[86], allOffsets, PersonalReaderModeSchema.serialize, object.personalReaderModeList, ); writer.writeObject( - offsets[85], + offsets[87], allOffsets, PlayerSubtitleSettingsSchema.serialize, object.playerSubtitleSettings, ); - writer.writeBool(offsets[86], object.pureBlackDarkMode); - writer.writeLong(offsets[87], object.relativeTimesTamps); - writer.writeBool(offsets[88], object.saveAsCBZArchive); - writer.writeByte(offsets[89], object.scaleType.index); - writer.writeBool(offsets[90], object.showPagesNumber); + writer.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[91], + offsets[93], allOffsets, SortChapterSchema.serialize, object.sortChapterList, ); writer.writeObject( - offsets[92], + offsets[94], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryAnime, ); writer.writeObject( - offsets[93], + offsets[95], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryManga, ); writer.writeObject( - offsets[94], + offsets[96], allOffsets, SortLibraryMangaSchema.serialize, object.sortLibraryNovel, ); - writer.writeLong(offsets[95], object.startDatebackup); - writer.writeBool(offsets[96], object.themeIsDark); - writer.writeBool(offsets[97], object.updateProgressAfterReading); - writer.writeBool(offsets[98], object.useLibass); - writer.writeBool(offsets[99], object.usePageTapZones); - writer.writeString(offsets[100], object.userAgent); + 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( @@ -1155,65 +1168,69 @@ Settings _settingsDeserialize( novelDisplayType: _SettingsnovelDisplayTypeValueEnumMap[ reader.readByteOrNull(offsets[73])] ?? DisplayType.comfortableGrid, - novelLibraryDownloadedChapters: reader.readBoolOrNull(offsets[75]), - novelLibraryLocalSource: reader.readBoolOrNull(offsets[76]), - novelLibraryShowCategoryTabs: reader.readBoolOrNull(offsets[77]), - novelLibraryShowContinueReadingButton: reader.readBoolOrNull(offsets[78]), - novelLibraryShowLanguage: reader.readBoolOrNull(offsets[79]), - novelLibraryShowNumbersOfItems: reader.readBoolOrNull(offsets[80]), - onlyIncludePinnedSources: reader.readBoolOrNull(offsets[81]), - pagePreloadAmount: reader.readLongOrNull(offsets[82]), + 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[82])] ?? + NovelTextAlign.left, + onlyIncludePinnedSources: reader.readBoolOrNull(offsets[83]), + pagePreloadAmount: reader.readLongOrNull(offsets[84]), personalPageModeList: reader.readObjectList( - offsets[83], + offsets[85], PersonalPageModeSchema.deserialize, allOffsets, PersonalPageMode(), ), personalReaderModeList: reader.readObjectList( - offsets[84], + offsets[86], PersonalReaderModeSchema.deserialize, allOffsets, PersonalReaderMode(), ), playerSubtitleSettings: reader.readObjectOrNull( - offsets[85], + offsets[87], PlayerSubtitleSettingsSchema.deserialize, allOffsets, ), - pureBlackDarkMode: reader.readBoolOrNull(offsets[86]), - relativeTimesTamps: reader.readLongOrNull(offsets[87]), - saveAsCBZArchive: reader.readBoolOrNull(offsets[88]), + pureBlackDarkMode: reader.readBoolOrNull(offsets[88]), + relativeTimesTamps: reader.readLongOrNull(offsets[89]), + saveAsCBZArchive: reader.readBoolOrNull(offsets[90]), scaleType: - _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[89])] ?? + _SettingsscaleTypeValueEnumMap[reader.readByteOrNull(offsets[91])] ?? ScaleType.fitScreen, - showPagesNumber: reader.readBoolOrNull(offsets[90]), + showPagesNumber: reader.readBoolOrNull(offsets[92]), sortChapterList: reader.readObjectList( - offsets[91], + offsets[93], SortChapterSchema.deserialize, allOffsets, SortChapter(), ), sortLibraryAnime: reader.readObjectOrNull( - offsets[92], - SortLibraryMangaSchema.deserialize, - allOffsets, - ), - sortLibraryManga: reader.readObjectOrNull( - offsets[93], - SortLibraryMangaSchema.deserialize, - allOffsets, - ), - sortLibraryNovel: reader.readObjectOrNull( offsets[94], SortLibraryMangaSchema.deserialize, allOffsets, ), - startDatebackup: reader.readLongOrNull(offsets[95]), - themeIsDark: reader.readBoolOrNull(offsets[96]), - updateProgressAfterReading: reader.readBoolOrNull(offsets[97]), - useLibass: reader.readBoolOrNull(offsets[98]), - usePageTapZones: reader.readBoolOrNull(offsets[99]), - userAgent: reader.readStringOrNull(offsets[100]), + sortLibraryManga: reader.readObjectOrNull( + offsets[95], + SortLibraryMangaSchema.deserialize, + allOffsets, + ), + sortLibraryNovel: reader.readObjectOrNull( + offsets[96], + SortLibraryMangaSchema.deserialize, + allOffsets, + ), + 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( @@ -1239,7 +1256,7 @@ Settings _settingsDeserialize( L10nLocaleSchema.deserialize, allOffsets, ); - object.novelGridSize = reader.readLongOrNull(offsets[74]); + object.novelGridSize = reader.readLongOrNull(offsets[75]); return object; } @@ -1464,7 +1481,7 @@ P _settingsDeserializeProp

( case 74: return (reader.readLongOrNull(offset)) as P; case 75: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 76: return (reader.readBoolOrNull(offset)) as P; case 77: @@ -1478,57 +1495,51 @@ P _settingsDeserializeProp

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

( allOffsets, )) as P; case 95: - return (reader.readLongOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 96: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readObjectOrNull( + offset, + SortLibraryMangaSchema.deserialize, + allOffsets, + )) as P; case 97: - return (reader.readBoolOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 98: return (reader.readBoolOrNull(offset)) as P; case 99: return (reader.readBoolOrNull(offset)) as P; case 100: + return (reader.readBoolOrNull(offset)) as P; + case 101: + return (reader.readBoolOrNull(offset)) as P; + case 102: return (reader.readStringOrNull(offset)) as P; default: throw IsarError('Unknown property with id $propertyId'); @@ -1668,6 +1691,18 @@ const _SettingsnovelDisplayTypeValueEnumMap = { 2: DisplayType.coverOnlyGrid, 3: DisplayType.list, }; +const _SettingsnovelTextAlignEnumValueMap = { + 'left': 0, + 'center': 1, + 'right': 2, + 'block': 3, +}; +const _SettingsnovelTextAlignValueEnumMap = { + 0: NovelTextAlign.left, + 1: NovelTextAlign.center, + 2: NovelTextAlign.right, + 3: NovelTextAlign.block, +}; const _SettingsscaleTypeEnumValueMap = { 'fitScreen': 0, 'stretch': 1, @@ -6612,6 +6647,78 @@ extension SettingsQueryFilter }); } + QueryBuilder + novelFontSizeIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'novelFontSize', + )); + }); + } + + QueryBuilder + novelFontSizeIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'novelFontSize', + )); + }); + } + + QueryBuilder novelFontSizeEqualTo( + int? value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelFontSize', + value: value, + )); + }); + } + + QueryBuilder + novelFontSizeGreaterThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'novelFontSize', + value: value, + )); + }); + } + + QueryBuilder novelFontSizeLessThan( + int? value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'novelFontSize', + value: value, + )); + }); + } + + QueryBuilder novelFontSizeBetween( + int? lower, + int? upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'novelFontSize', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder novelGridSizeIsNull() { return QueryBuilder.apply(this, (query) { @@ -6852,6 +6959,61 @@ extension SettingsQueryFilter }); } + QueryBuilder novelTextAlignEqualTo( + NovelTextAlign value) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'novelTextAlign', + value: value, + )); + }); + } + + QueryBuilder + novelTextAlignGreaterThan( + NovelTextAlign value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'novelTextAlign', + value: value, + )); + }); + } + + QueryBuilder + novelTextAlignLessThan( + NovelTextAlign value, { + bool include = false, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'novelTextAlign', + value: value, + )); + }); + } + + QueryBuilder novelTextAlignBetween( + NovelTextAlign lower, + NovelTextAlign upper, { + bool includeLower = true, + bool includeUpper = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.between( + property: r'novelTextAlign', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + )); + }); + } + QueryBuilder onlyIncludePinnedSourcesIsNull() { return QueryBuilder.apply(this, (query) { @@ -8902,6 +9064,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByNovelFontSize() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelFontSize', Sort.asc); + }); + } + + QueryBuilder sortByNovelFontSizeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelFontSize', Sort.desc); + }); + } + QueryBuilder sortByNovelGridSize() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelGridSize', Sort.asc); @@ -9000,6 +9174,18 @@ extension SettingsQuerySortBy on QueryBuilder { }); } + QueryBuilder sortByNovelTextAlign() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelTextAlign', Sort.asc); + }); + } + + QueryBuilder sortByNovelTextAlignDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelTextAlign', Sort.desc); + }); + } + QueryBuilder sortByOnlyIncludePinnedSources() { return QueryBuilder.apply(this, (query) { @@ -10004,6 +10190,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByNovelFontSize() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelFontSize', Sort.asc); + }); + } + + QueryBuilder thenByNovelFontSizeDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelFontSize', Sort.desc); + }); + } + QueryBuilder thenByNovelGridSize() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'novelGridSize', Sort.asc); @@ -10102,6 +10300,18 @@ extension SettingsQuerySortThenBy }); } + QueryBuilder thenByNovelTextAlign() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelTextAlign', Sort.asc); + }); + } + + QueryBuilder thenByNovelTextAlignDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'novelTextAlign', Sort.desc); + }); + } + QueryBuilder thenByOnlyIncludePinnedSources() { return QueryBuilder.apply(this, (query) { @@ -10691,6 +10901,12 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByNovelFontSize() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelFontSize'); + }); + } + QueryBuilder distinctByNovelGridSize() { return QueryBuilder.apply(this, (query) { return query.addDistinctBy(r'novelGridSize'); @@ -10739,6 +10955,12 @@ extension SettingsQueryWhereDistinct }); } + QueryBuilder distinctByNovelTextAlign() { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'novelTextAlign'); + }); + } + QueryBuilder distinctByOnlyIncludePinnedSources() { return QueryBuilder.apply(this, (query) { @@ -11326,6 +11548,12 @@ extension SettingsQueryProperty }); } + QueryBuilder novelFontSizeProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelFontSize'); + }); + } + QueryBuilder novelGridSizeProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'novelGridSize'); @@ -11374,6 +11602,13 @@ extension SettingsQueryProperty }); } + QueryBuilder + novelTextAlignProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'novelTextAlign'); + }); + } + QueryBuilder onlyIncludePinnedSourcesProperty() { return QueryBuilder.apply(this, (query) { 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 b89ac61..09316bd 100644 --- a/lib/modules/more/settings/reader/providers/reader_state_provider.dart +++ b/lib/modules/more/settings/reader/providers/reader_state_provider.dart @@ -182,3 +182,33 @@ class HideNovelState extends _$HideNovelState { () => isar.settings.putSync(settings!..hideNovel = value)); } } + +@riverpod +class NovelFontSizeState extends _$NovelFontSizeState { + @override + int build() { + return isar.settings.getSync(227)!.novelFontSize ?? 14; + } + + void set(int value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync(settings!..novelFontSize = value)); + } +} + +@riverpod +class NovelTextAlignState extends _$NovelTextAlignState { + @override + NovelTextAlign build() { + return isar.settings.getSync(227)!.novelTextAlign; + } + + void set(NovelTextAlign value) { + final settings = isar.settings.getSync(227); + state = value; + isar.writeTxnSync( + () => isar.settings.putSync(settings!..novelTextAlign = value)); + } +} diff --git a/lib/modules/more/settings/reader/providers/reader_state_provider.g.dart b/lib/modules/more/settings/reader/providers/reader_state_provider.g.dart index c4a0d23..0c5634d 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 @@ -205,5 +205,39 @@ final hideNovelStateProvider = ); typedef _$HideNovelState = AutoDisposeNotifier; +String _$novelFontSizeStateHash() => + r'fd104e358203d3f86e14d933518f2dbd067cec13'; + +/// See also [NovelFontSizeState]. +@ProviderFor(NovelFontSizeState) +final novelFontSizeStateProvider = + AutoDisposeNotifierProvider.internal( + NovelFontSizeState.new, + name: r'novelFontSizeStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$novelFontSizeStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$NovelFontSizeState = AutoDisposeNotifier; +String _$novelTextAlignStateHash() => + r'87664160c3962b96b8582a7581cf1e4ebb870363'; + +/// See also [NovelTextAlignState]. +@ProviderFor(NovelTextAlignState) +final novelTextAlignStateProvider = + AutoDisposeNotifierProvider.internal( + NovelTextAlignState.new, + name: r'novelTextAlignStateProvider', + debugGetCreateSourceHash: const bool.fromEnvironment('dart.vm.product') + ? null + : _$novelTextAlignStateHash, + dependencies: null, + allTransitiveDependencies: null, +); + +typedef _$NovelTextAlignState = AutoDisposeNotifier; // ignore_for_file: type=lint // ignore_for_file: subtype_of_sealed_class, invalid_use_of_internal_member, invalid_use_of_visible_for_testing_member, deprecated_member_use_from_same_package diff --git a/lib/modules/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart index c3a9ca7..d517c01 100644 --- a/lib/modules/novel/novel_reader_view.dart +++ b/lib/modules/novel/novel_reader_view.dart @@ -1,5 +1,6 @@ import 'dart:async'; import 'dart:io'; +import 'dart:math'; import 'package:extended_image/extended_image.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter/services.dart'; @@ -71,6 +72,7 @@ class _NovelWebViewState extends ConsumerState bool scrolled = false; double offset = 0; double maxOffset = 0; + int fontSize = 14; bool isDesktop = Platform.isMacOS || Platform.isLinux || Platform.isWindows; void onScroll() { @@ -106,6 +108,10 @@ class _NovelWebViewState extends ConsumerState super.initState(); WidgetsBinding.instance.addPostFrameCallback((_) { _scrollController.addListener(onScroll); + final initFontSize = ref.read(novelFontSizeStateProvider); + setState(() { + fontSize = initFontSize; + }); }); } @@ -249,7 +255,7 @@ class _NovelWebViewState extends ConsumerState BackgroundColor.white ? Colors.black : Colors.white, - fontSize: 14), + fontSize: fontSize.toDouble()), ), Center( heightFactor: 2, @@ -310,9 +316,8 @@ class _NovelWebViewState extends ConsumerState )), ], ), - //_gestureRightLeft(), - //_gestureTopBottom(), _appBar(), + _bottomBar(backgroundColor), ], ), ), @@ -431,6 +436,250 @@ class _NovelWebViewState extends ConsumerState ); } + Widget _bottomBar(BackgroundColor backgroundColor) { + if (!_isView && Platform.isIOS) { + return const SizedBox.shrink(); + } + bool hasPrevChapter = _readerController.getChapterIndex().$1 + 1 != + _readerController + .getChaptersLength(_readerController.getChapterIndex().$2); + bool hasNextChapter = _readerController.getChapterIndex().$1 != 0; + final novelTextAlign = ref.watch(novelTextAlignStateProvider); + + return Positioned( + bottom: 0, + child: AnimatedContainer( + curve: Curves.ease, + duration: const Duration(milliseconds: 300), + width: context.width(1), + height: (_isView ? 130 : 0), + child: Column( + children: [ + Flexible( + child: Transform.scale( + scaleX: 1, + child: Row( + children: [ + Padding( + padding: const EdgeInsets.all(8.0), + child: CircleAvatar( + radius: 23, + backgroundColor: _backgroundColor(context), + child: IconButton( + onPressed: hasPrevChapter + ? () { + pushReplacementMangaReaderView( + context: context, + chapter: + _readerController.getPrevChapter()); + } + : null, + icon: Transform.scale( + scaleX: 1, + child: Icon(Icons.skip_previous_rounded, + color: hasPrevChapter + ? Theme.of(context) + .textTheme + .bodyLarge! + .color + : Theme.of(context) + .textTheme + .bodyLarge! + .color! + .withValues(alpha: 0.4)), + )), + ), + ), + Flexible( + child: Padding( + padding: const EdgeInsets.symmetric(vertical: 10), + child: Container( + height: 70, + decoration: BoxDecoration( + color: _backgroundColor(context), + borderRadius: BorderRadius.circular(25)), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Transform.scale( + scaleX: 1, + child: SizedBox( + width: 55, + child: Center( + child: IconButton( + onPressed: () { + final newFontSize = + max(4, fontSize - 1); + ref + .read(novelFontSizeStateProvider + .notifier) + .set(newFontSize); + setState(() { + fontSize = newFontSize; + }); + }, + icon: const Icon(Icons.text_decrease)), + ), + ), + ), + if (_isView) + Flexible( + flex: 14, + child: + Consumer(builder: (context, ref, child) { + final currentFontSize = ref.watch(novelFontSizeStateProvider); + return SliderTheme( + data: SliderTheme.of(context).copyWith( + overlayShape: + const RoundSliderOverlayShape( + overlayRadius: 5.0), + ), + child: Slider( + onChanged: (value) { + ref + .read(novelFontSizeStateProvider + .notifier) + .set(value.toInt()); + }, + onChangeEnd: (newValue) { + try { + setState(() { + fontSize = newValue.toInt(); + }); + } catch (_) {} + }, + divisions: 36, + value: currentFontSize.toDouble(), + label: "$currentFontSize", + min: 4, + max: 40, + ), + ); + }), + ), + Transform.scale( + scaleX: 1, + child: SizedBox( + width: 55, + child: Center( + child: IconButton( + onPressed: () { + final newFontSize = + min(40, fontSize + 1); + ref + .read(novelFontSizeStateProvider + .notifier) + .set(newFontSize); + setState(() { + fontSize = newFontSize; + }); + }, + icon: const Icon(Icons.text_increase)), + ), + ), + ), + ], + ), + ), + ), + ), + Padding( + padding: const EdgeInsets.all(8.0), + child: CircleAvatar( + radius: 23, + backgroundColor: _backgroundColor(context), + child: IconButton( + onPressed: hasNextChapter + ? () { + pushReplacementMangaReaderView( + context: context, + chapter: _readerController.getNextChapter(), + ); + } + : null, + icon: Transform.scale( + scaleX: 1, + child: Icon( + Icons.skip_next_rounded, + color: hasNextChapter + ? Theme.of(context).textTheme.bodyLarge!.color + : Theme.of(context) + .textTheme + .bodyLarge! + .color! + .withValues(alpha: 0.4), + // size: 17, + ), + ), + ), + ), + ), + ], + ), + ), + ), + Flexible( + child: Container( + height: 65, + color: _backgroundColor(context), + child: Row( + mainAxisAlignment: MainAxisAlignment.spaceAround, + children: [ + PopupMenuButton( + popUpAnimationStyle: popupAnimationStyle, + color: Colors.black, + child: const Icon( + Icons.app_settings_alt_outlined, + ), + onSelected: (value) { + ref + .read(novelTextAlignStateProvider.notifier) + .set(value); + }, + itemBuilder: (context) => [ + for (var mode in NovelTextAlign.values) + PopupMenuItem( + value: mode, + child: Row( + children: [ + Icon( + Icons.check, + color: novelTextAlign == mode + ? Colors.white + : Colors.transparent, + ), + const SizedBox( + width: 7, + ), + Text( + mode.name, + style: const TextStyle( + color: Colors.white, + fontSize: 12, + ), + ), + ], + )), + ], + ), + IconButton( + onPressed: () { + // _showModalSettings(); + }, + icon: const Icon( + Icons.settings_rounded, + ), + ), + ], + ), + ), + ), + ], + ), + ), + ); + } + void _isViewFunction() { final fullScreenReader = ref.watch(fullScreenReaderStateProvider); if (mounted) { @@ -447,84 +696,6 @@ class _NovelWebViewState extends ConsumerState } } } - - Widget _gestureRightLeft() { - return Consumer( - builder: (context, ref, child) { - return Row( - children: [ - /// left region - Expanded( - flex: 2, - child: GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () { - _isViewFunction(); - }, - ), - ), - - /// center region - Expanded( - flex: 2, - child: GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () { - _isViewFunction(); - }, - ), - ), - - /// right region - Expanded( - flex: 2, - child: GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () { - _isViewFunction(); - }, - ), - ), - ], - ); - }, - ); - } - - Widget _gestureTopBottom() { - return Consumer( - builder: (context, ref, child) { - return Column( - children: [ - /// top region - Expanded( - flex: 2, - child: GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () { - _isViewFunction(); - }, - ), - ), - - /// center region - const Expanded(flex: 5, child: SizedBox.shrink()), - - /// bottom region - Expanded( - flex: 2, - child: GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () { - _isViewFunction(); - }, - ), - ), - ], - ); - }, - ); - } } class UChapDataPreload { From 0d29f634ebbf58afa698e44c6a8005e766725b06 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Sat, 4 Jan 2025 00:04:08 +0100 Subject: [PATCH 2/3] added scrollbar --- lib/modules/novel/novel_reader_view.dart | 169 ++++++++++++----------- 1 file changed, 88 insertions(+), 81 deletions(-) diff --git a/lib/modules/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart index d517c01..0d6b180 100644 --- a/lib/modules/novel/novel_reader_view.dart +++ b/lib/modules/novel/novel_reader_view.dart @@ -220,88 +220,94 @@ class _NovelWebViewState extends ConsumerState } }); return Expanded( - child: SingleChildScrollView( + child: Scrollbar( controller: _scrollController, - physics: const BouncingScrollPhysics(), - child: GestureDetector( - behavior: HitTestBehavior.translucent, - onTap: () { - _isViewFunction(); - }, - child: Column( - children: [ - HtmlWidget( - htmlContent, - customStylesBuilder: (element) { - switch (backgroundColor) { - case BackgroundColor.black: - return { - 'background-color': 'black', - }; - default: - return { - 'background-color': '#F0F0F0', - }; - } - }, - onTapUrl: (url) { - context.push("/mangawebview", - extra: {'url': url, 'title': url}); - return true; - }, - renderMode: RenderMode.column, - textStyle: TextStyle( - color: backgroundColor == - BackgroundColor.white - ? Colors.black - : Colors.white, - fontSize: fontSize.toDouble()), - ), - Center( - heightFactor: 2, - child: Row( - mainAxisAlignment: - MainAxisAlignment.center, - spacing: 5, - children: [ - IconButton( - padding: const EdgeInsets.all(5), - onPressed: () => - pushReplacementMangaReaderView( - context: context, - chapter: _readerController - .getPrevChapter(), - ), - icon: Icon( - size: 32, - Icons.arrow_back, - color: backgroundColor == - BackgroundColor.white - ? Colors.black - : Colors.white, - ), - ), - IconButton( - padding: const EdgeInsets.all(5), - onPressed: () => - pushReplacementMangaReaderView( - context: context, - chapter: _readerController - .getNextChapter(), - ), - icon: Icon( - size: 32, - Icons.arrow_forward, - color: backgroundColor == - BackgroundColor.white - ? Colors.black - : Colors.white, - ), - ), - ], + interactive: true, + child: SingleChildScrollView( + controller: _scrollController, + physics: const BouncingScrollPhysics(), + child: GestureDetector( + behavior: HitTestBehavior.translucent, + onTap: () { + _isViewFunction(); + }, + child: Column( + children: [ + HtmlWidget( + htmlContent, + customStylesBuilder: (element) { + switch (backgroundColor) { + case BackgroundColor.black: + return { + 'background-color': 'black', + }; + default: + return { + 'background-color': '#F0F0F0', + }; + } + }, + onTapUrl: (url) { + context.push("/mangawebview", extra: { + 'url': url, + 'title': url + }); + return true; + }, + renderMode: RenderMode.column, + textStyle: TextStyle( + color: backgroundColor == + BackgroundColor.white + ? Colors.black + : Colors.white, + fontSize: fontSize.toDouble()), ), - ), - ], + Center( + heightFactor: 2, + child: Row( + mainAxisAlignment: + MainAxisAlignment.center, + spacing: 5, + children: [ + IconButton( + padding: const EdgeInsets.all(5), + onPressed: () => + pushReplacementMangaReaderView( + context: context, + chapter: _readerController + .getPrevChapter(), + ), + icon: Icon( + size: 32, + Icons.arrow_back, + color: backgroundColor == + BackgroundColor.white + ? Colors.black + : Colors.white, + ), + ), + IconButton( + padding: const EdgeInsets.all(5), + onPressed: () => + pushReplacementMangaReaderView( + context: context, + chapter: _readerController + .getNextChapter(), + ), + icon: Icon( + size: 32, + Icons.arrow_forward, + color: backgroundColor == + BackgroundColor.white + ? Colors.black + : Colors.white, + ), + ), + ], + ), + ), + ], + ), ), ), ), @@ -527,7 +533,8 @@ class _NovelWebViewState extends ConsumerState flex: 14, child: Consumer(builder: (context, ref, child) { - final currentFontSize = ref.watch(novelFontSizeStateProvider); + final currentFontSize = + ref.watch(novelFontSizeStateProvider); return SliderTheme( data: SliderTheme.of(context).copyWith( overlayShape: From b4fa508ab890b28eb3bb22344804ee5c09d885f0 Mon Sep 17 00:00:00 2001 From: Schnitzel5 Date: Mon, 6 Jan 2025 18:49:16 +0100 Subject: [PATCH 3/3] hide novel reader settings for now --- lib/modules/novel/novel_reader_view.dart | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/modules/novel/novel_reader_view.dart b/lib/modules/novel/novel_reader_view.dart index 0d6b180..7a25311 100644 --- a/lib/modules/novel/novel_reader_view.dart +++ b/lib/modules/novel/novel_reader_view.dart @@ -625,7 +625,7 @@ class _NovelWebViewState extends ConsumerState ), ), ), - Flexible( + /*Flexible( child: Container( height: 65, color: _backgroundColor(context), @@ -636,7 +636,7 @@ class _NovelWebViewState extends ConsumerState popUpAnimationStyle: popupAnimationStyle, color: Colors.black, child: const Icon( - Icons.app_settings_alt_outlined, + Icons.format_align_center_outlined, ), onSelected: (value) { ref @@ -680,7 +680,7 @@ class _NovelWebViewState extends ConsumerState ], ), ), - ), + ),*/ ], ), ),