diff --git a/lib/eval/bridge/m_manga.dart b/lib/eval/bridge/m_manga.dart index 558647d7..8e3282ea 100644 --- a/lib/eval/bridge/m_manga.dart +++ b/lib/eval/bridge/m_manga.dart @@ -22,6 +22,8 @@ class $MManga implements MManga, $Instance { fields: { 'author': BridgeFieldDef( BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))), + 'artist': BridgeFieldDef( + BridgeTypeAnnotation(BridgeTypeRef(CoreTypes.string))), 'status': BridgeFieldDef(BridgeTypeAnnotation($MStatus.$type)), 'genre': BridgeFieldDef( BridgeTypeAnnotation( @@ -58,6 +60,8 @@ class $MManga implements MManga, $Instance { switch (identifier) { case 'author': return $String($value.author!); + case 'artist': + return $String($value.artist!); case 'status': return $MStatus.wrap($value.status!); case 'genre': @@ -88,6 +92,8 @@ class $MManga implements MManga, $Instance { switch (identifier) { case 'author': $value.author = value.$reified; + case 'artist': + $value.artist = value.$reified; case 'status': $value.status = value.$reified; case 'genre': @@ -118,6 +124,9 @@ class $MManga implements MManga, $Instance { @override String? get author => $value.author; + @override + String? get artist => $value.artist; + @override String? get description => $value.description; @@ -144,6 +153,11 @@ class $MManga implements MManga, $Instance { // implement author } + @override + set artist(String? artist) { + // implement artist + } + @override set description(String? description) { // implement description diff --git a/lib/eval/model/m_manga.dart b/lib/eval/model/m_manga.dart index 28e533a7..054def9c 100644 --- a/lib/eval/model/m_manga.dart +++ b/lib/eval/model/m_manga.dart @@ -12,6 +12,8 @@ class MManga { String? author; + String? artist; + Status? status; List? genre; @@ -20,6 +22,7 @@ class MManga { MManga( {this.author, + this.artist, this.genre, this.imageUrl, this.link, diff --git a/lib/models/manga.dart b/lib/models/manga.dart index 7199ec79..19b05931 100644 --- a/lib/models/manga.dart +++ b/lib/models/manga.dart @@ -17,6 +17,8 @@ class Manga { String? author; + String? artist; + @enumerated late Status status; @@ -51,6 +53,7 @@ class Manga { {this.id = Isar.autoIncrement, required this.source, required this.author, + required this.artist, this.favorite = false, required this.genre, required this.imageUrl, @@ -70,6 +73,7 @@ class Manga { Manga.fromJson(Map json) { author = json['author']; + artist = json['artist']; categories = json['categories']?.cast(); customCoverImage = json['customCoverImage']?.cast(); dateAdded = json['dateAdded']; @@ -92,6 +96,7 @@ class Manga { Map toJson() => { 'author': author, + 'artist': artist, 'categories': categories, 'customCoverImage': customCoverImage, 'dateAdded': dateAdded, diff --git a/lib/models/manga.g.dart b/lib/models/manga.g.dart index bdade26b..3b11ebd4 100644 --- a/lib/models/manga.g.dart +++ b/lib/models/manga.g.dart @@ -17,93 +17,98 @@ const MangaSchema = CollectionSchema( name: r'Manga', id: -5643034226035087553, properties: { - r'author': PropertySchema( + r'artist': PropertySchema( id: 0, + name: r'artist', + type: IsarType.string, + ), + r'author': PropertySchema( + id: 1, name: r'author', type: IsarType.string, ), r'categories': PropertySchema( - id: 1, + id: 2, name: r'categories', type: IsarType.longList, ), r'customCoverFromTracker': PropertySchema( - id: 2, + id: 3, name: r'customCoverFromTracker', type: IsarType.string, ), r'customCoverImage': PropertySchema( - id: 3, + id: 4, name: r'customCoverImage', type: IsarType.byteList, ), r'dateAdded': PropertySchema( - id: 4, + id: 5, name: r'dateAdded', type: IsarType.long, ), r'description': PropertySchema( - id: 5, + id: 6, name: r'description', type: IsarType.string, ), r'favorite': PropertySchema( - id: 6, + id: 7, name: r'favorite', type: IsarType.bool, ), r'genre': PropertySchema( - id: 7, + id: 8, name: r'genre', type: IsarType.stringList, ), r'imageUrl': PropertySchema( - id: 8, + id: 9, name: r'imageUrl', type: IsarType.string, ), r'isLocalArchive': PropertySchema( - id: 9, + id: 10, name: r'isLocalArchive', type: IsarType.bool, ), r'isManga': PropertySchema( - id: 10, + id: 11, name: r'isManga', type: IsarType.bool, ), r'lang': PropertySchema( - id: 11, + id: 12, name: r'lang', type: IsarType.string, ), r'lastRead': PropertySchema( - id: 12, + id: 13, name: r'lastRead', type: IsarType.long, ), r'lastUpdate': PropertySchema( - id: 13, + id: 14, name: r'lastUpdate', type: IsarType.long, ), r'link': PropertySchema( - id: 14, + id: 15, name: r'link', type: IsarType.string, ), r'name': PropertySchema( - id: 15, + id: 16, name: r'name', type: IsarType.string, ), r'source': PropertySchema( - id: 16, + id: 17, name: r'source', type: IsarType.string, ), r'status': PropertySchema( - id: 17, + id: 18, name: r'status', type: IsarType.byte, enumMap: _MangastatusEnumValueMap, @@ -137,6 +142,12 @@ int _mangaEstimateSize( Map> allOffsets, ) { var bytesCount = offsets.last; + { + final value = object.artist; + if (value != null) { + bytesCount += 3 + value.length * 3; + } + } { final value = object.author; if (value != null) { @@ -218,24 +229,25 @@ void _mangaSerialize( List offsets, Map> allOffsets, ) { - writer.writeString(offsets[0], object.author); - writer.writeLongList(offsets[1], object.categories); - writer.writeString(offsets[2], object.customCoverFromTracker); - writer.writeByteList(offsets[3], object.customCoverImage); - writer.writeLong(offsets[4], object.dateAdded); - writer.writeString(offsets[5], object.description); - writer.writeBool(offsets[6], object.favorite); - writer.writeStringList(offsets[7], object.genre); - writer.writeString(offsets[8], object.imageUrl); - writer.writeBool(offsets[9], object.isLocalArchive); - writer.writeBool(offsets[10], object.isManga); - writer.writeString(offsets[11], object.lang); - writer.writeLong(offsets[12], object.lastRead); - writer.writeLong(offsets[13], object.lastUpdate); - writer.writeString(offsets[14], object.link); - writer.writeString(offsets[15], object.name); - writer.writeString(offsets[16], object.source); - writer.writeByte(offsets[17], object.status.index); + writer.writeString(offsets[0], object.artist); + writer.writeString(offsets[1], object.author); + writer.writeLongList(offsets[2], object.categories); + writer.writeString(offsets[3], object.customCoverFromTracker); + writer.writeByteList(offsets[4], object.customCoverImage); + writer.writeLong(offsets[5], object.dateAdded); + writer.writeString(offsets[6], object.description); + writer.writeBool(offsets[7], object.favorite); + writer.writeStringList(offsets[8], object.genre); + writer.writeString(offsets[9], object.imageUrl); + writer.writeBool(offsets[10], object.isLocalArchive); + writer.writeBool(offsets[11], object.isManga); + writer.writeString(offsets[12], object.lang); + writer.writeLong(offsets[13], object.lastRead); + writer.writeLong(offsets[14], object.lastUpdate); + writer.writeString(offsets[15], object.link); + writer.writeString(offsets[16], object.name); + writer.writeString(offsets[17], object.source); + writer.writeByte(offsets[18], object.status.index); } Manga _mangaDeserialize( @@ -245,25 +257,26 @@ Manga _mangaDeserialize( Map> allOffsets, ) { final object = Manga( - author: reader.readStringOrNull(offsets[0]), - categories: reader.readLongList(offsets[1]), - customCoverFromTracker: reader.readStringOrNull(offsets[2]), - customCoverImage: reader.readByteList(offsets[3]), - dateAdded: reader.readLongOrNull(offsets[4]), - description: reader.readStringOrNull(offsets[5]), - favorite: reader.readBoolOrNull(offsets[6]), - genre: reader.readStringList(offsets[7]), + artist: reader.readStringOrNull(offsets[0]), + author: reader.readStringOrNull(offsets[1]), + categories: reader.readLongList(offsets[2]), + customCoverFromTracker: reader.readStringOrNull(offsets[3]), + customCoverImage: reader.readByteList(offsets[4]), + dateAdded: reader.readLongOrNull(offsets[5]), + description: reader.readStringOrNull(offsets[6]), + favorite: reader.readBoolOrNull(offsets[7]), + genre: reader.readStringList(offsets[8]), id: id, - imageUrl: reader.readStringOrNull(offsets[8]), - isLocalArchive: reader.readBoolOrNull(offsets[9]), - isManga: reader.readBoolOrNull(offsets[10]), - lang: reader.readStringOrNull(offsets[11]), - lastRead: reader.readLongOrNull(offsets[12]), - lastUpdate: reader.readLongOrNull(offsets[13]), - link: reader.readStringOrNull(offsets[14]), - name: reader.readStringOrNull(offsets[15]), - source: reader.readStringOrNull(offsets[16]), - status: _MangastatusValueEnumMap[reader.readByteOrNull(offsets[17])] ?? + imageUrl: reader.readStringOrNull(offsets[9]), + isLocalArchive: reader.readBoolOrNull(offsets[10]), + isManga: reader.readBoolOrNull(offsets[11]), + lang: reader.readStringOrNull(offsets[12]), + lastRead: reader.readLongOrNull(offsets[13]), + lastUpdate: reader.readLongOrNull(offsets[14]), + link: reader.readStringOrNull(offsets[15]), + name: reader.readStringOrNull(offsets[16]), + source: reader.readStringOrNull(offsets[17]), + status: _MangastatusValueEnumMap[reader.readByteOrNull(offsets[18])] ?? Status.ongoing, ); return object; @@ -279,38 +292,40 @@ P _mangaDeserializeProp

( case 0: return (reader.readStringOrNull(offset)) as P; case 1: - return (reader.readLongList(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 2: - return (reader.readStringOrNull(offset)) as P; + return (reader.readLongList(offset)) as P; case 3: - return (reader.readByteList(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 4: - return (reader.readLongOrNull(offset)) as P; + return (reader.readByteList(offset)) as P; case 5: - return (reader.readStringOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 6: - return (reader.readBoolOrNull(offset)) as P; - case 7: - return (reader.readStringList(offset)) as P; - case 8: return (reader.readStringOrNull(offset)) as P; - case 9: + case 7: return (reader.readBoolOrNull(offset)) as P; + case 8: + return (reader.readStringList(offset)) as P; + case 9: + return (reader.readStringOrNull(offset)) as P; case 10: return (reader.readBoolOrNull(offset)) as P; case 11: - return (reader.readStringOrNull(offset)) as P; + return (reader.readBoolOrNull(offset)) as P; case 12: - return (reader.readLongOrNull(offset)) as P; + return (reader.readStringOrNull(offset)) as P; case 13: return (reader.readLongOrNull(offset)) as P; case 14: - return (reader.readStringOrNull(offset)) as P; + return (reader.readLongOrNull(offset)) as P; case 15: return (reader.readStringOrNull(offset)) as P; case 16: return (reader.readStringOrNull(offset)) as P; case 17: + return (reader.readStringOrNull(offset)) as P; + case 18: return (_MangastatusValueEnumMap[reader.readByteOrNull(offset)] ?? Status.ongoing) as P; default: @@ -424,6 +439,151 @@ extension MangaQueryWhere on QueryBuilder { } extension MangaQueryFilter on QueryBuilder { + QueryBuilder artistIsNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNull( + property: r'artist', + )); + }); + } + + QueryBuilder artistIsNotNull() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(const FilterCondition.isNotNull( + property: r'artist', + )); + }); + } + + QueryBuilder artistEqualTo( + String? value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'artist', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder artistGreaterThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + include: include, + property: r'artist', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder artistLessThan( + String? value, { + bool include = false, + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.lessThan( + include: include, + property: r'artist', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder artistBetween( + 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'artist', + lower: lower, + includeLower: includeLower, + upper: upper, + includeUpper: includeUpper, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder artistStartsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.startsWith( + property: r'artist', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder artistEndsWith( + String value, { + bool caseSensitive = true, + }) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.endsWith( + property: r'artist', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder artistContains(String value, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.contains( + property: r'artist', + value: value, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder artistMatches( + String pattern, + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.matches( + property: r'artist', + wildcard: pattern, + caseSensitive: caseSensitive, + )); + }); + } + + QueryBuilder artistIsEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.equalTo( + property: r'artist', + value: '', + )); + }); + } + + QueryBuilder artistIsNotEmpty() { + return QueryBuilder.apply(this, (query) { + return query.addFilterCondition(FilterCondition.greaterThan( + property: r'artist', + value: '', + )); + }); + } + QueryBuilder authorIsNull() { return QueryBuilder.apply(this, (query) { return query.addFilterCondition(const FilterCondition.isNull( @@ -2607,6 +2767,18 @@ extension MangaQueryLinks on QueryBuilder { } extension MangaQuerySortBy on QueryBuilder { + QueryBuilder sortByArtist() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'artist', Sort.asc); + }); + } + + QueryBuilder sortByArtistDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'artist', Sort.desc); + }); + } + QueryBuilder sortByAuthor() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'author', Sort.asc); @@ -2789,6 +2961,18 @@ extension MangaQuerySortBy on QueryBuilder { } extension MangaQuerySortThenBy on QueryBuilder { + QueryBuilder thenByArtist() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'artist', Sort.asc); + }); + } + + QueryBuilder thenByArtistDesc() { + return QueryBuilder.apply(this, (query) { + return query.addSortBy(r'artist', Sort.desc); + }); + } + QueryBuilder thenByAuthor() { return QueryBuilder.apply(this, (query) { return query.addSortBy(r'author', Sort.asc); @@ -2983,6 +3167,13 @@ extension MangaQuerySortThenBy on QueryBuilder { } extension MangaQueryWhereDistinct on QueryBuilder { + QueryBuilder distinctByArtist( + {bool caseSensitive = true}) { + return QueryBuilder.apply(this, (query) { + return query.addDistinctBy(r'artist', caseSensitive: caseSensitive); + }); + } + QueryBuilder distinctByAuthor( {bool caseSensitive = true}) { return QueryBuilder.apply(this, (query) { @@ -3108,6 +3299,12 @@ extension MangaQueryProperty on QueryBuilder { }); } + QueryBuilder artistProperty() { + return QueryBuilder.apply(this, (query) { + return query.addPropertyName(r'artist'); + }); + } + QueryBuilder authorProperty() { return QueryBuilder.apply(this, (query) { return query.addPropertyName(r'author'); diff --git a/lib/modules/library/providers/local_archive.dart b/lib/modules/library/providers/local_archive.dart index af9c65ab..e7dfe1bb 100644 --- a/lib/modules/library/providers/local_archive.dart +++ b/lib/modules/library/providers/local_archive.dart @@ -35,6 +35,7 @@ Future importArchivesFromFile(ImportArchivesFromFileRef ref, Manga? mManga, status: Status.unknown, description: '', isLocalArchive: true, + artist: '', ); for (var file in result.files.reversed.toList()) { (String, LocalExtensionType, Uint8List, String)? data = isManga diff --git a/lib/modules/library/providers/local_archive.g.dart b/lib/modules/library/providers/local_archive.g.dart index eedd72dd..7a037c9f 100644 --- a/lib/modules/library/providers/local_archive.g.dart +++ b/lib/modules/library/providers/local_archive.g.dart @@ -7,7 +7,7 @@ part of 'local_archive.dart'; // ************************************************************************** String _$importArchivesFromFileHash() => - r'cbc93a01e89564117369b764d226f4943bf7ee49'; + r'4ac9e6c438919a1ea8cebd28cb554b13b5e53cc2'; /// Copied from Dart SDK class _SystemHash { diff --git a/lib/modules/library/widgets/library_gridview_widget.dart b/lib/modules/library/widgets/library_gridview_widget.dart index 4bffb542..c36f777d 100644 --- a/lib/modules/library/widgets/library_gridview_widget.dart +++ b/lib/modules/library/widgets/library_gridview_widget.dart @@ -194,7 +194,7 @@ class LibraryGridViewWidget extends StatelessWidget { child: Padding( padding: const EdgeInsets.all(5), child: Container( - color: context.primaryColor, + color: context.themeData.cardColor, child: Container( decoration: BoxDecoration( borderRadius: const BorderRadius.only( diff --git a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart index b4757ee7..e7676678 100644 --- a/lib/modules/manga/detail/providers/update_manga_detail_providers.dart +++ b/lib/modules/manga/detail/providers/update_manga_detail_providers.dart @@ -37,6 +37,8 @@ Future updateMangaDetail(UpdateMangaDetailRef ref, [] ..author = getManga.author?.trim().trimLeft().trimRight() ?? manga.author ?? "" + ..artist = + getManga.artist?.trim().trimLeft().trimRight() ?? manga.artist ?? "" ..status = getManga.status == Status.unknown ? manga.status : getManga.status! ..description = getManga.description?.trim().trimLeft().trimRight() ?? diff --git a/lib/modules/widgets/manga_image_card_widget.dart b/lib/modules/widgets/manga_image_card_widget.dart index eede39c4..4ee2cd3a 100644 --- a/lib/modules/widgets/manga_image_card_widget.dart +++ b/lib/modules/widgets/manga_image_card_widget.dart @@ -106,7 +106,8 @@ void pushToMangaReaderDetail( source: source, lang: lang, lastUpdate: 0, - isManga: isManga ?? true); + isManga: isManga ?? true, + artist: getManga.artist ?? ''); final empty = isar.mangas .filter() .langEqualTo(lang) diff --git a/lib/utils/extensions/build_context_extensions.dart b/lib/utils/extensions/build_context_extensions.dart index cebcf3b0..292ac648 100644 --- a/lib/utils/extensions/build_context_extensions.dart +++ b/lib/utils/extensions/build_context_extensions.dart @@ -13,6 +13,10 @@ extension BuildContextExtensions on BuildContext { return Theme.of(this).iconTheme.color!.withOpacity(0.7); } + ThemeData get themeData { + return Theme.of(this); + } + double mediaHeight(double data) { return MediaQuery.of(this).size.height * data; }