Merge branch 'feature/light-novel' into feature/novel
This commit is contained in:
commit
ca16d34332
49 changed files with 5263 additions and 962 deletions
|
|
@ -210,6 +210,7 @@
|
||||||
"anime_sources": "Anime-Quellen",
|
"anime_sources": "Anime-Quellen",
|
||||||
"anime_extensions": "Anime-Erweiterungen",
|
"anime_extensions": "Anime-Erweiterungen",
|
||||||
"manga_extensions": "Manga-Erweiterungen",
|
"manga_extensions": "Manga-Erweiterungen",
|
||||||
|
"novel": "Novel",
|
||||||
"anime": "Anime",
|
"anime": "Anime",
|
||||||
"manga": "Manga",
|
"manga": "Manga",
|
||||||
"library_no_category_exist": "Sie haben noch keine Kategorien",
|
"library_no_category_exist": "Sie haben noch keine Kategorien",
|
||||||
|
|
|
||||||
|
|
@ -209,10 +209,13 @@
|
||||||
"n_episodes": "{n} episodes",
|
"n_episodes": "{n} episodes",
|
||||||
"manga_sources": "Manga Sources",
|
"manga_sources": "Manga Sources",
|
||||||
"anime_sources": "Anime Sources",
|
"anime_sources": "Anime Sources",
|
||||||
|
"novel_sources": "Novel Sources",
|
||||||
"anime_extensions": "Anime Extensions",
|
"anime_extensions": "Anime Extensions",
|
||||||
"manga_extensions": "Manga Extensions",
|
"manga_extensions": "Manga Extensions",
|
||||||
|
"novel_extensions": "Novel Extensions",
|
||||||
"anime": "Anime",
|
"anime": "Anime",
|
||||||
"manga": "Manga",
|
"manga": "Manga",
|
||||||
|
"novel": "Novel",
|
||||||
"library_no_category_exist": "You don't have any categories yet",
|
"library_no_category_exist": "You don't have any categories yet",
|
||||||
"watching": "Watching",
|
"watching": "Watching",
|
||||||
"plan_to_watch": "Plan to watch",
|
"plan_to_watch": "Plan to watch",
|
||||||
|
|
|
||||||
|
|
@ -1,4 +1,5 @@
|
||||||
import 'package:isar/isar.dart';
|
import 'package:isar/isar.dart';
|
||||||
|
import 'package:mangayomi/models/manga.dart';
|
||||||
part 'category.g.dart';
|
part 'category.g.dart';
|
||||||
|
|
||||||
@collection
|
@collection
|
||||||
|
|
@ -6,18 +7,19 @@ part 'category.g.dart';
|
||||||
class Category {
|
class Category {
|
||||||
Id? id;
|
Id? id;
|
||||||
String? name;
|
String? name;
|
||||||
bool? forManga;
|
@enumerated
|
||||||
|
late ItemType forItemType;
|
||||||
Category(
|
Category(
|
||||||
{this.id = Isar.autoIncrement,
|
{this.id = Isar.autoIncrement,
|
||||||
required this.name,
|
required this.name,
|
||||||
required this.forManga});
|
required this.forItemType});
|
||||||
|
|
||||||
Category.fromJson(Map<String, dynamic> json) {
|
Category.fromJson(Map<String, dynamic> json) {
|
||||||
id = json['id'];
|
id = json['id'];
|
||||||
name = json['name'];
|
name = json['name'];
|
||||||
forManga = json['forManga'];
|
forItemType = json['forItemType'];
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() =>
|
Map<String, dynamic> toJson() =>
|
||||||
{'id': id, 'name': name, 'forManga': forManga};
|
{'id': id, 'name': name, 'forItemType': forItemType};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -17,10 +17,11 @@ const CategorySchema = CollectionSchema(
|
||||||
name: r'Category',
|
name: r'Category',
|
||||||
id: 5751694338128944171,
|
id: 5751694338128944171,
|
||||||
properties: {
|
properties: {
|
||||||
r'forManga': PropertySchema(
|
r'forItemType': PropertySchema(
|
||||||
id: 0,
|
id: 0,
|
||||||
name: r'forManga',
|
name: r'forItemType',
|
||||||
type: IsarType.bool,
|
type: IsarType.byte,
|
||||||
|
enumMap: _CategoryforItemTypeEnumValueMap,
|
||||||
),
|
),
|
||||||
r'name': PropertySchema(
|
r'name': PropertySchema(
|
||||||
id: 1,
|
id: 1,
|
||||||
|
|
@ -63,7 +64,7 @@ void _categorySerialize(
|
||||||
List<int> offsets,
|
List<int> offsets,
|
||||||
Map<Type, List<int>> allOffsets,
|
Map<Type, List<int>> allOffsets,
|
||||||
) {
|
) {
|
||||||
writer.writeBool(offsets[0], object.forManga);
|
writer.writeByte(offsets[0], object.forItemType.index);
|
||||||
writer.writeString(offsets[1], object.name);
|
writer.writeString(offsets[1], object.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -74,7 +75,9 @@ Category _categoryDeserialize(
|
||||||
Map<Type, List<int>> allOffsets,
|
Map<Type, List<int>> allOffsets,
|
||||||
) {
|
) {
|
||||||
final object = Category(
|
final object = Category(
|
||||||
forManga: reader.readBoolOrNull(offsets[0]),
|
forItemType:
|
||||||
|
_CategoryforItemTypeValueEnumMap[reader.readByteOrNull(offsets[0])] ??
|
||||||
|
ItemType.manga,
|
||||||
id: id,
|
id: id,
|
||||||
name: reader.readStringOrNull(offsets[1]),
|
name: reader.readStringOrNull(offsets[1]),
|
||||||
);
|
);
|
||||||
|
|
@ -89,7 +92,8 @@ P _categoryDeserializeProp<P>(
|
||||||
) {
|
) {
|
||||||
switch (propertyId) {
|
switch (propertyId) {
|
||||||
case 0:
|
case 0:
|
||||||
return (reader.readBoolOrNull(offset)) as P;
|
return (_CategoryforItemTypeValueEnumMap[reader.readByteOrNull(offset)] ??
|
||||||
|
ItemType.manga) as P;
|
||||||
case 1:
|
case 1:
|
||||||
return (reader.readStringOrNull(offset)) as P;
|
return (reader.readStringOrNull(offset)) as P;
|
||||||
default:
|
default:
|
||||||
|
|
@ -97,6 +101,17 @@ P _categoryDeserializeProp<P>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const _CategoryforItemTypeEnumValueMap = {
|
||||||
|
'manga': 0,
|
||||||
|
'anime': 1,
|
||||||
|
'novel': 2,
|
||||||
|
};
|
||||||
|
const _CategoryforItemTypeValueEnumMap = {
|
||||||
|
0: ItemType.manga,
|
||||||
|
1: ItemType.anime,
|
||||||
|
2: ItemType.novel,
|
||||||
|
};
|
||||||
|
|
||||||
Id _categoryGetId(Category object) {
|
Id _categoryGetId(Category object) {
|
||||||
return object.id ?? Isar.autoIncrement;
|
return object.id ?? Isar.autoIncrement;
|
||||||
}
|
}
|
||||||
|
|
@ -186,32 +201,60 @@ extension CategoryQueryWhere on QueryBuilder<Category, Category, QWhereClause> {
|
||||||
|
|
||||||
extension CategoryQueryFilter
|
extension CategoryQueryFilter
|
||||||
on QueryBuilder<Category, Category, QFilterCondition> {
|
on QueryBuilder<Category, Category, QFilterCondition> {
|
||||||
QueryBuilder<Category, Category, QAfterFilterCondition> forMangaIsNull() {
|
QueryBuilder<Category, Category, QAfterFilterCondition> forItemTypeEqualTo(
|
||||||
return QueryBuilder.apply(this, (query) {
|
ItemType value) {
|
||||||
return query.addFilterCondition(const FilterCondition.isNull(
|
|
||||||
property: r'forManga',
|
|
||||||
));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
QueryBuilder<Category, Category, QAfterFilterCondition> forMangaIsNotNull() {
|
|
||||||
return QueryBuilder.apply(this, (query) {
|
|
||||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
|
||||||
property: r'forManga',
|
|
||||||
));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
QueryBuilder<Category, Category, QAfterFilterCondition> forMangaEqualTo(
|
|
||||||
bool? value) {
|
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addFilterCondition(FilterCondition.equalTo(
|
return query.addFilterCondition(FilterCondition.equalTo(
|
||||||
property: r'forManga',
|
property: r'forItemType',
|
||||||
value: value,
|
value: value,
|
||||||
));
|
));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Category, Category, QAfterFilterCondition>
|
||||||
|
forItemTypeGreaterThan(
|
||||||
|
ItemType value, {
|
||||||
|
bool include = false,
|
||||||
|
}) {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||||
|
include: include,
|
||||||
|
property: r'forItemType',
|
||||||
|
value: value,
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Category, Category, QAfterFilterCondition> forItemTypeLessThan(
|
||||||
|
ItemType value, {
|
||||||
|
bool include = false,
|
||||||
|
}) {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addFilterCondition(FilterCondition.lessThan(
|
||||||
|
include: include,
|
||||||
|
property: r'forItemType',
|
||||||
|
value: value,
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Category, Category, QAfterFilterCondition> forItemTypeBetween(
|
||||||
|
ItemType lower,
|
||||||
|
ItemType upper, {
|
||||||
|
bool includeLower = true,
|
||||||
|
bool includeUpper = true,
|
||||||
|
}) {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addFilterCondition(FilterCondition.between(
|
||||||
|
property: r'forItemType',
|
||||||
|
lower: lower,
|
||||||
|
includeLower: includeLower,
|
||||||
|
upper: upper,
|
||||||
|
includeUpper: includeUpper,
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
QueryBuilder<Category, Category, QAfterFilterCondition> idIsNull() {
|
QueryBuilder<Category, Category, QAfterFilterCondition> idIsNull() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addFilterCondition(const FilterCondition.isNull(
|
return query.addFilterCondition(const FilterCondition.isNull(
|
||||||
|
|
@ -434,15 +477,15 @@ extension CategoryQueryLinks
|
||||||
on QueryBuilder<Category, Category, QFilterCondition> {}
|
on QueryBuilder<Category, Category, QFilterCondition> {}
|
||||||
|
|
||||||
extension CategoryQuerySortBy on QueryBuilder<Category, Category, QSortBy> {
|
extension CategoryQuerySortBy on QueryBuilder<Category, Category, QSortBy> {
|
||||||
QueryBuilder<Category, Category, QAfterSortBy> sortByForManga() {
|
QueryBuilder<Category, Category, QAfterSortBy> sortByForItemType() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'forManga', Sort.asc);
|
return query.addSortBy(r'forItemType', Sort.asc);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<Category, Category, QAfterSortBy> sortByForMangaDesc() {
|
QueryBuilder<Category, Category, QAfterSortBy> sortByForItemTypeDesc() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'forManga', Sort.desc);
|
return query.addSortBy(r'forItemType', Sort.desc);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -461,15 +504,15 @@ extension CategoryQuerySortBy on QueryBuilder<Category, Category, QSortBy> {
|
||||||
|
|
||||||
extension CategoryQuerySortThenBy
|
extension CategoryQuerySortThenBy
|
||||||
on QueryBuilder<Category, Category, QSortThenBy> {
|
on QueryBuilder<Category, Category, QSortThenBy> {
|
||||||
QueryBuilder<Category, Category, QAfterSortBy> thenByForManga() {
|
QueryBuilder<Category, Category, QAfterSortBy> thenByForItemType() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'forManga', Sort.asc);
|
return query.addSortBy(r'forItemType', Sort.asc);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<Category, Category, QAfterSortBy> thenByForMangaDesc() {
|
QueryBuilder<Category, Category, QAfterSortBy> thenByForItemTypeDesc() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'forManga', Sort.desc);
|
return query.addSortBy(r'forItemType', Sort.desc);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -500,9 +543,9 @@ extension CategoryQuerySortThenBy
|
||||||
|
|
||||||
extension CategoryQueryWhereDistinct
|
extension CategoryQueryWhereDistinct
|
||||||
on QueryBuilder<Category, Category, QDistinct> {
|
on QueryBuilder<Category, Category, QDistinct> {
|
||||||
QueryBuilder<Category, Category, QDistinct> distinctByForManga() {
|
QueryBuilder<Category, Category, QDistinct> distinctByForItemType() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addDistinctBy(r'forManga');
|
return query.addDistinctBy(r'forItemType');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -522,9 +565,9 @@ extension CategoryQueryProperty
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<Category, bool?, QQueryOperations> forMangaProperty() {
|
QueryBuilder<Category, ItemType, QQueryOperations> forItemTypeProperty() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addPropertyName(r'forManga');
|
return query.addPropertyName(r'forItemType');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
import 'package:isar/isar.dart';
|
import 'package:isar/isar.dart';
|
||||||
import 'package:mangayomi/models/chapter.dart';
|
import 'package:mangayomi/models/chapter.dart';
|
||||||
|
import 'package:mangayomi/models/manga.dart';
|
||||||
part 'history.g.dart';
|
part 'history.g.dart';
|
||||||
|
|
||||||
@collection
|
@collection
|
||||||
|
|
@ -11,7 +12,8 @@ class History {
|
||||||
|
|
||||||
int? chapterId;
|
int? chapterId;
|
||||||
|
|
||||||
bool? isManga;
|
@enumerated
|
||||||
|
late ItemType itemType;
|
||||||
|
|
||||||
final chapter = IsarLink<Chapter>();
|
final chapter = IsarLink<Chapter>();
|
||||||
|
|
||||||
|
|
@ -19,7 +21,7 @@ class History {
|
||||||
|
|
||||||
History({
|
History({
|
||||||
this.id = Isar.autoIncrement,
|
this.id = Isar.autoIncrement,
|
||||||
required this.isManga,
|
required this.itemType,
|
||||||
required this.chapterId,
|
required this.chapterId,
|
||||||
required this.mangaId,
|
required this.mangaId,
|
||||||
required this.date,
|
required this.date,
|
||||||
|
|
@ -29,7 +31,7 @@ class History {
|
||||||
chapterId = json['chapterId'];
|
chapterId = json['chapterId'];
|
||||||
date = json['date'];
|
date = json['date'];
|
||||||
id = json['id'];
|
id = json['id'];
|
||||||
isManga = json['isManga'];
|
itemType = json['itemType'];
|
||||||
mangaId = json['mangaId'];
|
mangaId = json['mangaId'];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -37,7 +39,7 @@ class History {
|
||||||
'chapterId': chapterId,
|
'chapterId': chapterId,
|
||||||
'date': date,
|
'date': date,
|
||||||
'id': id,
|
'id': id,
|
||||||
'isManga': isManga,
|
'itemType': itemType,
|
||||||
'mangaId': mangaId
|
'mangaId': mangaId
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -27,10 +27,11 @@ const HistorySchema = CollectionSchema(
|
||||||
name: r'date',
|
name: r'date',
|
||||||
type: IsarType.string,
|
type: IsarType.string,
|
||||||
),
|
),
|
||||||
r'isManga': PropertySchema(
|
r'itemType': PropertySchema(
|
||||||
id: 2,
|
id: 2,
|
||||||
name: r'isManga',
|
name: r'itemType',
|
||||||
type: IsarType.bool,
|
type: IsarType.byte,
|
||||||
|
enumMap: _HistoryitemTypeEnumValueMap,
|
||||||
),
|
),
|
||||||
r'mangaId': PropertySchema(
|
r'mangaId': PropertySchema(
|
||||||
id: 3,
|
id: 3,
|
||||||
|
|
@ -82,7 +83,7 @@ void _historySerialize(
|
||||||
) {
|
) {
|
||||||
writer.writeLong(offsets[0], object.chapterId);
|
writer.writeLong(offsets[0], object.chapterId);
|
||||||
writer.writeString(offsets[1], object.date);
|
writer.writeString(offsets[1], object.date);
|
||||||
writer.writeBool(offsets[2], object.isManga);
|
writer.writeByte(offsets[2], object.itemType.index);
|
||||||
writer.writeLong(offsets[3], object.mangaId);
|
writer.writeLong(offsets[3], object.mangaId);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -96,7 +97,8 @@ History _historyDeserialize(
|
||||||
chapterId: reader.readLongOrNull(offsets[0]),
|
chapterId: reader.readLongOrNull(offsets[0]),
|
||||||
date: reader.readStringOrNull(offsets[1]),
|
date: reader.readStringOrNull(offsets[1]),
|
||||||
id: id,
|
id: id,
|
||||||
isManga: reader.readBoolOrNull(offsets[2]),
|
itemType: _HistoryitemTypeValueEnumMap[reader.readByteOrNull(offsets[2])] ??
|
||||||
|
ItemType.manga,
|
||||||
mangaId: reader.readLongOrNull(offsets[3]),
|
mangaId: reader.readLongOrNull(offsets[3]),
|
||||||
);
|
);
|
||||||
return object;
|
return object;
|
||||||
|
|
@ -114,7 +116,8 @@ P _historyDeserializeProp<P>(
|
||||||
case 1:
|
case 1:
|
||||||
return (reader.readStringOrNull(offset)) as P;
|
return (reader.readStringOrNull(offset)) as P;
|
||||||
case 2:
|
case 2:
|
||||||
return (reader.readBoolOrNull(offset)) as P;
|
return (_HistoryitemTypeValueEnumMap[reader.readByteOrNull(offset)] ??
|
||||||
|
ItemType.manga) as P;
|
||||||
case 3:
|
case 3:
|
||||||
return (reader.readLongOrNull(offset)) as P;
|
return (reader.readLongOrNull(offset)) as P;
|
||||||
default:
|
default:
|
||||||
|
|
@ -122,6 +125,17 @@ P _historyDeserializeProp<P>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const _HistoryitemTypeEnumValueMap = {
|
||||||
|
'manga': 0,
|
||||||
|
'anime': 1,
|
||||||
|
'novel': 2,
|
||||||
|
};
|
||||||
|
const _HistoryitemTypeValueEnumMap = {
|
||||||
|
0: ItemType.manga,
|
||||||
|
1: ItemType.anime,
|
||||||
|
2: ItemType.novel,
|
||||||
|
};
|
||||||
|
|
||||||
Id _historyGetId(History object) {
|
Id _historyGetId(History object) {
|
||||||
return object.id ?? Isar.autoIncrement;
|
return object.id ?? Isar.autoIncrement;
|
||||||
}
|
}
|
||||||
|
|
@ -495,32 +509,59 @@ extension HistoryQueryFilter
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<History, History, QAfterFilterCondition> isMangaIsNull() {
|
QueryBuilder<History, History, QAfterFilterCondition> itemTypeEqualTo(
|
||||||
return QueryBuilder.apply(this, (query) {
|
ItemType value) {
|
||||||
return query.addFilterCondition(const FilterCondition.isNull(
|
|
||||||
property: r'isManga',
|
|
||||||
));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
QueryBuilder<History, History, QAfterFilterCondition> isMangaIsNotNull() {
|
|
||||||
return QueryBuilder.apply(this, (query) {
|
|
||||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
|
||||||
property: r'isManga',
|
|
||||||
));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
QueryBuilder<History, History, QAfterFilterCondition> isMangaEqualTo(
|
|
||||||
bool? value) {
|
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addFilterCondition(FilterCondition.equalTo(
|
return query.addFilterCondition(FilterCondition.equalTo(
|
||||||
property: r'isManga',
|
property: r'itemType',
|
||||||
value: value,
|
value: value,
|
||||||
));
|
));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QueryBuilder<History, History, QAfterFilterCondition> itemTypeGreaterThan(
|
||||||
|
ItemType value, {
|
||||||
|
bool include = false,
|
||||||
|
}) {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||||
|
include: include,
|
||||||
|
property: r'itemType',
|
||||||
|
value: value,
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryBuilder<History, History, QAfterFilterCondition> itemTypeLessThan(
|
||||||
|
ItemType value, {
|
||||||
|
bool include = false,
|
||||||
|
}) {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addFilterCondition(FilterCondition.lessThan(
|
||||||
|
include: include,
|
||||||
|
property: r'itemType',
|
||||||
|
value: value,
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryBuilder<History, History, QAfterFilterCondition> itemTypeBetween(
|
||||||
|
ItemType lower,
|
||||||
|
ItemType upper, {
|
||||||
|
bool includeLower = true,
|
||||||
|
bool includeUpper = true,
|
||||||
|
}) {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addFilterCondition(FilterCondition.between(
|
||||||
|
property: r'itemType',
|
||||||
|
lower: lower,
|
||||||
|
includeLower: includeLower,
|
||||||
|
upper: upper,
|
||||||
|
includeUpper: includeUpper,
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
QueryBuilder<History, History, QAfterFilterCondition> mangaIdIsNull() {
|
QueryBuilder<History, History, QAfterFilterCondition> mangaIdIsNull() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addFilterCondition(const FilterCondition.isNull(
|
return query.addFilterCondition(const FilterCondition.isNull(
|
||||||
|
|
@ -635,15 +676,15 @@ extension HistoryQuerySortBy on QueryBuilder<History, History, QSortBy> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<History, History, QAfterSortBy> sortByIsManga() {
|
QueryBuilder<History, History, QAfterSortBy> sortByItemType() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'isManga', Sort.asc);
|
return query.addSortBy(r'itemType', Sort.asc);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<History, History, QAfterSortBy> sortByIsMangaDesc() {
|
QueryBuilder<History, History, QAfterSortBy> sortByItemTypeDesc() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'isManga', Sort.desc);
|
return query.addSortBy(r'itemType', Sort.desc);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -698,15 +739,15 @@ extension HistoryQuerySortThenBy
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<History, History, QAfterSortBy> thenByIsManga() {
|
QueryBuilder<History, History, QAfterSortBy> thenByItemType() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'isManga', Sort.asc);
|
return query.addSortBy(r'itemType', Sort.asc);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<History, History, QAfterSortBy> thenByIsMangaDesc() {
|
QueryBuilder<History, History, QAfterSortBy> thenByItemTypeDesc() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'isManga', Sort.desc);
|
return query.addSortBy(r'itemType', Sort.desc);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -738,9 +779,9 @@ extension HistoryQueryWhereDistinct
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<History, History, QDistinct> distinctByIsManga() {
|
QueryBuilder<History, History, QDistinct> distinctByItemType() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addDistinctBy(r'isManga');
|
return query.addDistinctBy(r'itemType');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -771,9 +812,9 @@ extension HistoryQueryProperty
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<History, bool?, QQueryOperations> isMangaProperty() {
|
QueryBuilder<History, ItemType, QQueryOperations> itemTypeProperty() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addPropertyName(r'isManga');
|
return query.addPropertyName(r'itemType');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -22,7 +22,8 @@ class Manga {
|
||||||
@enumerated
|
@enumerated
|
||||||
late Status status;
|
late Status status;
|
||||||
|
|
||||||
bool? isManga;
|
@enumerated
|
||||||
|
late ItemType itemType;
|
||||||
|
|
||||||
List<String>? genre;
|
List<String>? genre;
|
||||||
|
|
||||||
|
|
@ -62,7 +63,7 @@ class Manga {
|
||||||
required this.name,
|
required this.name,
|
||||||
required this.status,
|
required this.status,
|
||||||
required this.description,
|
required this.description,
|
||||||
this.isManga = true,
|
this.itemType = ItemType.manga,
|
||||||
this.dateAdded,
|
this.dateAdded,
|
||||||
this.lastUpdate,
|
this.lastUpdate,
|
||||||
this.categories,
|
this.categories,
|
||||||
|
|
@ -83,7 +84,7 @@ class Manga {
|
||||||
id = json['id'];
|
id = json['id'];
|
||||||
imageUrl = json['imageUrl'];
|
imageUrl = json['imageUrl'];
|
||||||
isLocalArchive = json['isLocalArchive'];
|
isLocalArchive = json['isLocalArchive'];
|
||||||
isManga = json['isManga'];
|
itemType = ItemType.values[json['itemType']];
|
||||||
lang = json['lang'];
|
lang = json['lang'];
|
||||||
lastRead = json['lastRead'];
|
lastRead = json['lastRead'];
|
||||||
lastUpdate = json['lastUpdate'];
|
lastUpdate = json['lastUpdate'];
|
||||||
|
|
@ -106,7 +107,7 @@ class Manga {
|
||||||
'id': id,
|
'id': id,
|
||||||
'imageUrl': imageUrl,
|
'imageUrl': imageUrl,
|
||||||
'isLocalArchive': isLocalArchive,
|
'isLocalArchive': isLocalArchive,
|
||||||
'isManga': isManga,
|
'itemType': itemType.index,
|
||||||
'lang': lang,
|
'lang': lang,
|
||||||
'lastRead': lastRead,
|
'lastRead': lastRead,
|
||||||
'lastUpdate': lastUpdate,
|
'lastUpdate': lastUpdate,
|
||||||
|
|
@ -126,3 +127,9 @@ enum Status {
|
||||||
onHiatus,
|
onHiatus,
|
||||||
publishingFinished
|
publishingFinished
|
||||||
}
|
}
|
||||||
|
|
||||||
|
enum ItemType {
|
||||||
|
manga,
|
||||||
|
anime,
|
||||||
|
novel
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -72,10 +72,11 @@ const MangaSchema = CollectionSchema(
|
||||||
name: r'isLocalArchive',
|
name: r'isLocalArchive',
|
||||||
type: IsarType.bool,
|
type: IsarType.bool,
|
||||||
),
|
),
|
||||||
r'isManga': PropertySchema(
|
r'itemType': PropertySchema(
|
||||||
id: 11,
|
id: 11,
|
||||||
name: r'isManga',
|
name: r'itemType',
|
||||||
type: IsarType.bool,
|
type: IsarType.byte,
|
||||||
|
enumMap: _MangaitemTypeEnumValueMap,
|
||||||
),
|
),
|
||||||
r'lang': PropertySchema(
|
r'lang': PropertySchema(
|
||||||
id: 12,
|
id: 12,
|
||||||
|
|
@ -240,7 +241,7 @@ void _mangaSerialize(
|
||||||
writer.writeStringList(offsets[8], object.genre);
|
writer.writeStringList(offsets[8], object.genre);
|
||||||
writer.writeString(offsets[9], object.imageUrl);
|
writer.writeString(offsets[9], object.imageUrl);
|
||||||
writer.writeBool(offsets[10], object.isLocalArchive);
|
writer.writeBool(offsets[10], object.isLocalArchive);
|
||||||
writer.writeBool(offsets[11], object.isManga);
|
writer.writeByte(offsets[11], object.itemType.index);
|
||||||
writer.writeString(offsets[12], object.lang);
|
writer.writeString(offsets[12], object.lang);
|
||||||
writer.writeLong(offsets[13], object.lastRead);
|
writer.writeLong(offsets[13], object.lastRead);
|
||||||
writer.writeLong(offsets[14], object.lastUpdate);
|
writer.writeLong(offsets[14], object.lastUpdate);
|
||||||
|
|
@ -269,7 +270,8 @@ Manga _mangaDeserialize(
|
||||||
id: id,
|
id: id,
|
||||||
imageUrl: reader.readStringOrNull(offsets[9]),
|
imageUrl: reader.readStringOrNull(offsets[9]),
|
||||||
isLocalArchive: reader.readBoolOrNull(offsets[10]),
|
isLocalArchive: reader.readBoolOrNull(offsets[10]),
|
||||||
isManga: reader.readBoolOrNull(offsets[11]),
|
itemType: _MangaitemTypeValueEnumMap[reader.readByteOrNull(offsets[11])] ??
|
||||||
|
ItemType.manga,
|
||||||
lang: reader.readStringOrNull(offsets[12]),
|
lang: reader.readStringOrNull(offsets[12]),
|
||||||
lastRead: reader.readLongOrNull(offsets[13]),
|
lastRead: reader.readLongOrNull(offsets[13]),
|
||||||
lastUpdate: reader.readLongOrNull(offsets[14]),
|
lastUpdate: reader.readLongOrNull(offsets[14]),
|
||||||
|
|
@ -312,7 +314,8 @@ P _mangaDeserializeProp<P>(
|
||||||
case 10:
|
case 10:
|
||||||
return (reader.readBoolOrNull(offset)) as P;
|
return (reader.readBoolOrNull(offset)) as P;
|
||||||
case 11:
|
case 11:
|
||||||
return (reader.readBoolOrNull(offset)) as P;
|
return (_MangaitemTypeValueEnumMap[reader.readByteOrNull(offset)] ??
|
||||||
|
ItemType.manga) as P;
|
||||||
case 12:
|
case 12:
|
||||||
return (reader.readStringOrNull(offset)) as P;
|
return (reader.readStringOrNull(offset)) as P;
|
||||||
case 13:
|
case 13:
|
||||||
|
|
@ -333,6 +336,16 @@ P _mangaDeserializeProp<P>(
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const _MangaitemTypeEnumValueMap = {
|
||||||
|
'manga': 0,
|
||||||
|
'anime': 1,
|
||||||
|
'novel': 2,
|
||||||
|
};
|
||||||
|
const _MangaitemTypeValueEnumMap = {
|
||||||
|
0: ItemType.manga,
|
||||||
|
1: ItemType.anime,
|
||||||
|
2: ItemType.novel,
|
||||||
|
};
|
||||||
const _MangastatusEnumValueMap = {
|
const _MangastatusEnumValueMap = {
|
||||||
'ongoing': 0,
|
'ongoing': 0,
|
||||||
'completed': 1,
|
'completed': 1,
|
||||||
|
|
@ -1911,32 +1924,59 @@ extension MangaQueryFilter on QueryBuilder<Manga, Manga, QFilterCondition> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> isMangaIsNull() {
|
QueryBuilder<Manga, Manga, QAfterFilterCondition> itemTypeEqualTo(
|
||||||
return QueryBuilder.apply(this, (query) {
|
ItemType value) {
|
||||||
return query.addFilterCondition(const FilterCondition.isNull(
|
|
||||||
property: r'isManga',
|
|
||||||
));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> isMangaIsNotNull() {
|
|
||||||
return QueryBuilder.apply(this, (query) {
|
|
||||||
return query.addFilterCondition(const FilterCondition.isNotNull(
|
|
||||||
property: r'isManga',
|
|
||||||
));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> isMangaEqualTo(
|
|
||||||
bool? value) {
|
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addFilterCondition(FilterCondition.equalTo(
|
return query.addFilterCondition(FilterCondition.equalTo(
|
||||||
property: r'isManga',
|
property: r'itemType',
|
||||||
value: value,
|
value: value,
|
||||||
));
|
));
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Manga, Manga, QAfterFilterCondition> itemTypeGreaterThan(
|
||||||
|
ItemType value, {
|
||||||
|
bool include = false,
|
||||||
|
}) {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||||
|
include: include,
|
||||||
|
property: r'itemType',
|
||||||
|
value: value,
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Manga, Manga, QAfterFilterCondition> itemTypeLessThan(
|
||||||
|
ItemType value, {
|
||||||
|
bool include = false,
|
||||||
|
}) {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addFilterCondition(FilterCondition.lessThan(
|
||||||
|
include: include,
|
||||||
|
property: r'itemType',
|
||||||
|
value: value,
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Manga, Manga, QAfterFilterCondition> itemTypeBetween(
|
||||||
|
ItemType lower,
|
||||||
|
ItemType upper, {
|
||||||
|
bool includeLower = true,
|
||||||
|
bool includeUpper = true,
|
||||||
|
}) {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addFilterCondition(FilterCondition.between(
|
||||||
|
property: r'itemType',
|
||||||
|
lower: lower,
|
||||||
|
includeLower: includeLower,
|
||||||
|
upper: upper,
|
||||||
|
includeUpper: includeUpper,
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
QueryBuilder<Manga, Manga, QAfterFilterCondition> langIsNull() {
|
QueryBuilder<Manga, Manga, QAfterFilterCondition> langIsNull() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addFilterCondition(const FilterCondition.isNull(
|
return query.addFilterCondition(const FilterCondition.isNull(
|
||||||
|
|
@ -2863,15 +2903,15 @@ extension MangaQuerySortBy on QueryBuilder<Manga, Manga, QSortBy> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<Manga, Manga, QAfterSortBy> sortByIsManga() {
|
QueryBuilder<Manga, Manga, QAfterSortBy> sortByItemType() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'isManga', Sort.asc);
|
return query.addSortBy(r'itemType', Sort.asc);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<Manga, Manga, QAfterSortBy> sortByIsMangaDesc() {
|
QueryBuilder<Manga, Manga, QAfterSortBy> sortByItemTypeDesc() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'isManga', Sort.desc);
|
return query.addSortBy(r'itemType', Sort.desc);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3069,15 +3109,15 @@ extension MangaQuerySortThenBy on QueryBuilder<Manga, Manga, QSortThenBy> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<Manga, Manga, QAfterSortBy> thenByIsManga() {
|
QueryBuilder<Manga, Manga, QAfterSortBy> thenByItemType() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'isManga', Sort.asc);
|
return query.addSortBy(r'itemType', Sort.asc);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<Manga, Manga, QAfterSortBy> thenByIsMangaDesc() {
|
QueryBuilder<Manga, Manga, QAfterSortBy> thenByItemTypeDesc() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'isManga', Sort.desc);
|
return query.addSortBy(r'itemType', Sort.desc);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3239,9 +3279,9 @@ extension MangaQueryWhereDistinct on QueryBuilder<Manga, Manga, QDistinct> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<Manga, Manga, QDistinct> distinctByIsManga() {
|
QueryBuilder<Manga, Manga, QDistinct> distinctByItemType() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addDistinctBy(r'isManga');
|
return query.addDistinctBy(r'itemType');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -3366,9 +3406,9 @@ extension MangaQueryProperty on QueryBuilder<Manga, Manga, QQueryProperty> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
QueryBuilder<Manga, bool?, QQueryOperations> isMangaProperty() {
|
QueryBuilder<Manga, ItemType, QQueryOperations> itemTypeProperty() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addPropertyName(r'isManga');
|
return query.addPropertyName(r'itemType');
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -185,11 +185,38 @@ class Settings {
|
||||||
|
|
||||||
int? animeGridSize;
|
int? animeGridSize;
|
||||||
|
|
||||||
|
int? novelGridSize;
|
||||||
|
|
||||||
@enumerated
|
@enumerated
|
||||||
late SectionType disableSectionType;
|
late SectionType disableSectionType;
|
||||||
|
|
||||||
bool? useLibass;
|
bool? useLibass;
|
||||||
|
|
||||||
|
int? libraryFilterNovelDownloadType;
|
||||||
|
|
||||||
|
int? libraryFilterNovelUnreadType;
|
||||||
|
|
||||||
|
int? libraryFilterNovelStartedType;
|
||||||
|
|
||||||
|
int? libraryFilterNovelBookMarkedType;
|
||||||
|
|
||||||
|
bool? novelLibraryShowCategoryTabs;
|
||||||
|
|
||||||
|
bool? novelLibraryDownloadedChapters;
|
||||||
|
|
||||||
|
bool? novelLibraryShowLanguage;
|
||||||
|
|
||||||
|
bool? novelLibraryShowNumbersOfItems;
|
||||||
|
|
||||||
|
bool? novelLibraryShowContinueReadingButton;
|
||||||
|
|
||||||
|
bool? novelLibraryLocalSource;
|
||||||
|
|
||||||
|
late SortLibraryManga? sortLibraryNovel;
|
||||||
|
|
||||||
|
@enumerated
|
||||||
|
late DisplayType novelDisplayType;
|
||||||
|
|
||||||
Settings(
|
Settings(
|
||||||
{this.id = 227,
|
{this.id = 227,
|
||||||
this.displayType = DisplayType.compactGrid,
|
this.displayType = DisplayType.compactGrid,
|
||||||
|
|
@ -273,7 +300,19 @@ class Settings {
|
||||||
this.mangaGridSize,
|
this.mangaGridSize,
|
||||||
this.animeGridSize,
|
this.animeGridSize,
|
||||||
this.disableSectionType = SectionType.all,
|
this.disableSectionType = SectionType.all,
|
||||||
this.useLibass = true});
|
this.useLibass = true,
|
||||||
|
this.libraryFilterNovelDownloadType = 0,
|
||||||
|
this.libraryFilterNovelUnreadType = 0,
|
||||||
|
this.libraryFilterNovelStartedType = 0,
|
||||||
|
this.libraryFilterNovelBookMarkedType = 0,
|
||||||
|
this.novelLibraryShowCategoryTabs = false,
|
||||||
|
this.novelLibraryDownloadedChapters = false,
|
||||||
|
this.novelLibraryShowLanguage = false,
|
||||||
|
this.novelLibraryShowNumbersOfItems = false,
|
||||||
|
this.novelLibraryShowContinueReadingButton = false,
|
||||||
|
this.novelLibraryLocalSource,
|
||||||
|
this.sortLibraryNovel,
|
||||||
|
this.novelDisplayType = DisplayType.comfortableGrid});
|
||||||
|
|
||||||
Settings.fromJson(Map<String, dynamic> json) {
|
Settings.fromJson(Map<String, dynamic> json) {
|
||||||
animatePageTransitions = json['animatePageTransitions'];
|
animatePageTransitions = json['animatePageTransitions'];
|
||||||
|
|
@ -428,6 +467,22 @@ class Settings {
|
||||||
disableSectionType =
|
disableSectionType =
|
||||||
SectionType.values[json['disableSectionType'] ?? SectionType.all];
|
SectionType.values[json['disableSectionType'] ?? SectionType.all];
|
||||||
useLibass = json['useLibass'];
|
useLibass = json['useLibass'];
|
||||||
|
libraryFilterNovelBookMarkedType = json['libraryFilterNovelBookMarkedType'];
|
||||||
|
libraryFilterNovelDownloadType = json['libraryFilterNovelDownloadType'];
|
||||||
|
libraryFilterNovelStartedType = json['libraryFilterNovelStartedType'];
|
||||||
|
libraryFilterNovelUnreadType = json['libraryFilterNovelUnreadType'];
|
||||||
|
novelLibraryShowCategoryTabs = json['novelLibraryShowCategoryTabs'];
|
||||||
|
novelLibraryDownloadedChapters = json['novelLibraryDownloadedChapters'];
|
||||||
|
novelLibraryShowLanguage = json['novelLibraryShowLanguage'];
|
||||||
|
novelLibraryShowNumbersOfItems = json['novelLibraryShowNumbersOfItems'];
|
||||||
|
novelLibraryShowContinueReadingButton =
|
||||||
|
json['novelLibraryShowContinueReadingButton'];
|
||||||
|
novelLibraryLocalSource = json['novelLibraryLocalSource'];
|
||||||
|
sortLibraryNovel = json['sortLibraryNovel'] != null
|
||||||
|
? SortLibraryManga.fromJson(json['sortLibraryNovel'])
|
||||||
|
: null;
|
||||||
|
novelDisplayType = DisplayType
|
||||||
|
.values[json['novelDisplayType'] ?? DisplayType.compactGrid.index];
|
||||||
}
|
}
|
||||||
|
|
||||||
Map<String, dynamic> toJson() => {
|
Map<String, dynamic> toJson() => {
|
||||||
|
|
@ -527,7 +582,20 @@ class Settings {
|
||||||
'mangaGridSize': mangaGridSize,
|
'mangaGridSize': mangaGridSize,
|
||||||
'animeGridSize': animeGridSize,
|
'animeGridSize': animeGridSize,
|
||||||
'disableSectionType': disableSectionType.index,
|
'disableSectionType': disableSectionType.index,
|
||||||
'useLibass': useLibass
|
'useLibass': useLibass,
|
||||||
|
'libraryFilterNovelBookMarkedType': libraryFilterNovelBookMarkedType,
|
||||||
|
'libraryFilterNovelDownloadType': libraryFilterNovelDownloadType,
|
||||||
|
'libraryFilterNovelStartedType': libraryFilterNovelStartedType,
|
||||||
|
'libraryFilterNovelUnreadType': libraryFilterNovelUnreadType,
|
||||||
|
'novelLibraryShowCategoryTabs': novelLibraryShowCategoryTabs,
|
||||||
|
'novelLibraryDownloadedChapters': novelLibraryDownloadedChapters,
|
||||||
|
'novelLibraryShowLanguage': novelLibraryShowLanguage,
|
||||||
|
'novelLibraryShowNumbersOfItems': novelLibraryShowNumbersOfItems,
|
||||||
|
'novelLibraryShowContinueReadingButton':
|
||||||
|
novelLibraryShowContinueReadingButton,
|
||||||
|
'novelLibraryLocalSource': novelLibraryLocalSource,
|
||||||
|
'sortLibraryNovel': sortLibraryNovel?.toJson(),
|
||||||
|
'novelDisplayType': novelDisplayType.index,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -1,5 +1,6 @@
|
||||||
import 'package:isar/isar.dart';
|
import 'package:isar/isar.dart';
|
||||||
import 'package:mangayomi/eval/dart/model/m_source.dart';
|
import 'package:mangayomi/eval/dart/model/m_source.dart';
|
||||||
|
import 'package:mangayomi/models/manga.dart';
|
||||||
part 'source.g.dart';
|
part 'source.g.dart';
|
||||||
|
|
||||||
@collection
|
@collection
|
||||||
|
|
@ -49,6 +50,9 @@ class Source {
|
||||||
|
|
||||||
bool? isManga;
|
bool? isManga;
|
||||||
|
|
||||||
|
@enumerated
|
||||||
|
late ItemType itemType;
|
||||||
|
|
||||||
String? appMinVerReq;
|
String? appMinVerReq;
|
||||||
|
|
||||||
String? additionalParams;
|
String? additionalParams;
|
||||||
|
|
@ -83,6 +87,7 @@ class Source {
|
||||||
this.sourceCode = '',
|
this.sourceCode = '',
|
||||||
this.headers = '',
|
this.headers = '',
|
||||||
this.isManga = true,
|
this.isManga = true,
|
||||||
|
this.itemType = ItemType.manga,
|
||||||
this.appMinVerReq = "",
|
this.appMinVerReq = "",
|
||||||
this.additionalParams = "",
|
this.additionalParams = "",
|
||||||
this.isLocal = false,
|
this.isLocal = false,
|
||||||
|
|
@ -102,6 +107,7 @@ class Source {
|
||||||
isAdded = json['isAdded'];
|
isAdded = json['isAdded'];
|
||||||
isFullData = json['isFullData'];
|
isFullData = json['isFullData'];
|
||||||
isManga = json['isManga'];
|
isManga = json['isManga'];
|
||||||
|
itemType = ItemType.values[json['itemType'] ?? 0];
|
||||||
isNsfw = json['isNsfw'];
|
isNsfw = json['isNsfw'];
|
||||||
isPinned = json['isPinned'];
|
isPinned = json['isPinned'];
|
||||||
lang = json['lang'];
|
lang = json['lang'];
|
||||||
|
|
@ -133,6 +139,7 @@ class Source {
|
||||||
'isAdded': isAdded,
|
'isAdded': isAdded,
|
||||||
'isFullData': isFullData,
|
'isFullData': isFullData,
|
||||||
'isManga': isManga,
|
'isManga': isManga,
|
||||||
|
'itemType': itemType,
|
||||||
'isNsfw': isNsfw,
|
'isNsfw': isNsfw,
|
||||||
'isPinned': isPinned,
|
'isPinned': isPinned,
|
||||||
'lang': lang,
|
'lang': lang,
|
||||||
|
|
|
||||||
|
|
@ -107,49 +107,55 @@ const SourceSchema = CollectionSchema(
|
||||||
name: r'isTorrent',
|
name: r'isTorrent',
|
||||||
type: IsarType.bool,
|
type: IsarType.bool,
|
||||||
),
|
),
|
||||||
r'lang': PropertySchema(
|
r'itemType': PropertySchema(
|
||||||
id: 18,
|
id: 18,
|
||||||
|
name: r'itemType',
|
||||||
|
type: IsarType.byte,
|
||||||
|
enumMap: _SourceitemTypeEnumValueMap,
|
||||||
|
),
|
||||||
|
r'lang': PropertySchema(
|
||||||
|
id: 19,
|
||||||
name: r'lang',
|
name: r'lang',
|
||||||
type: IsarType.string,
|
type: IsarType.string,
|
||||||
),
|
),
|
||||||
r'lastUsed': PropertySchema(
|
r'lastUsed': PropertySchema(
|
||||||
id: 19,
|
id: 20,
|
||||||
name: r'lastUsed',
|
name: r'lastUsed',
|
||||||
type: IsarType.bool,
|
type: IsarType.bool,
|
||||||
),
|
),
|
||||||
r'name': PropertySchema(
|
r'name': PropertySchema(
|
||||||
id: 20,
|
id: 21,
|
||||||
name: r'name',
|
name: r'name',
|
||||||
type: IsarType.string,
|
type: IsarType.string,
|
||||||
),
|
),
|
||||||
r'sourceCode': PropertySchema(
|
r'sourceCode': PropertySchema(
|
||||||
id: 21,
|
id: 22,
|
||||||
name: r'sourceCode',
|
name: r'sourceCode',
|
||||||
type: IsarType.string,
|
type: IsarType.string,
|
||||||
),
|
),
|
||||||
r'sourceCodeLanguage': PropertySchema(
|
r'sourceCodeLanguage': PropertySchema(
|
||||||
id: 22,
|
id: 23,
|
||||||
name: r'sourceCodeLanguage',
|
name: r'sourceCodeLanguage',
|
||||||
type: IsarType.byte,
|
type: IsarType.byte,
|
||||||
enumMap: _SourcesourceCodeLanguageEnumValueMap,
|
enumMap: _SourcesourceCodeLanguageEnumValueMap,
|
||||||
),
|
),
|
||||||
r'sourceCodeUrl': PropertySchema(
|
r'sourceCodeUrl': PropertySchema(
|
||||||
id: 23,
|
id: 24,
|
||||||
name: r'sourceCodeUrl',
|
name: r'sourceCodeUrl',
|
||||||
type: IsarType.string,
|
type: IsarType.string,
|
||||||
),
|
),
|
||||||
r'typeSource': PropertySchema(
|
r'typeSource': PropertySchema(
|
||||||
id: 24,
|
id: 25,
|
||||||
name: r'typeSource',
|
name: r'typeSource',
|
||||||
type: IsarType.string,
|
type: IsarType.string,
|
||||||
),
|
),
|
||||||
r'version': PropertySchema(
|
r'version': PropertySchema(
|
||||||
id: 25,
|
id: 26,
|
||||||
name: r'version',
|
name: r'version',
|
||||||
type: IsarType.string,
|
type: IsarType.string,
|
||||||
),
|
),
|
||||||
r'versionLast': PropertySchema(
|
r'versionLast': PropertySchema(
|
||||||
id: 26,
|
id: 27,
|
||||||
name: r'versionLast',
|
name: r'versionLast',
|
||||||
type: IsarType.string,
|
type: IsarType.string,
|
||||||
)
|
)
|
||||||
|
|
@ -291,15 +297,16 @@ void _sourceSerialize(
|
||||||
writer.writeBool(offsets[15], object.isObsolete);
|
writer.writeBool(offsets[15], object.isObsolete);
|
||||||
writer.writeBool(offsets[16], object.isPinned);
|
writer.writeBool(offsets[16], object.isPinned);
|
||||||
writer.writeBool(offsets[17], object.isTorrent);
|
writer.writeBool(offsets[17], object.isTorrent);
|
||||||
writer.writeString(offsets[18], object.lang);
|
writer.writeByte(offsets[18], object.itemType.index);
|
||||||
writer.writeBool(offsets[19], object.lastUsed);
|
writer.writeString(offsets[19], object.lang);
|
||||||
writer.writeString(offsets[20], object.name);
|
writer.writeBool(offsets[20], object.lastUsed);
|
||||||
writer.writeString(offsets[21], object.sourceCode);
|
writer.writeString(offsets[21], object.name);
|
||||||
writer.writeByte(offsets[22], object.sourceCodeLanguage.index);
|
writer.writeString(offsets[22], object.sourceCode);
|
||||||
writer.writeString(offsets[23], object.sourceCodeUrl);
|
writer.writeByte(offsets[23], object.sourceCodeLanguage.index);
|
||||||
writer.writeString(offsets[24], object.typeSource);
|
writer.writeString(offsets[24], object.sourceCodeUrl);
|
||||||
writer.writeString(offsets[25], object.version);
|
writer.writeString(offsets[25], object.typeSource);
|
||||||
writer.writeString(offsets[26], object.versionLast);
|
writer.writeString(offsets[26], object.version);
|
||||||
|
writer.writeString(offsets[27], object.versionLast);
|
||||||
}
|
}
|
||||||
|
|
||||||
Source _sourceDeserialize(
|
Source _sourceDeserialize(
|
||||||
|
|
@ -327,17 +334,19 @@ Source _sourceDeserialize(
|
||||||
isNsfw: reader.readBoolOrNull(offsets[14]),
|
isNsfw: reader.readBoolOrNull(offsets[14]),
|
||||||
isObsolete: reader.readBoolOrNull(offsets[15]),
|
isObsolete: reader.readBoolOrNull(offsets[15]),
|
||||||
isPinned: reader.readBoolOrNull(offsets[16]),
|
isPinned: reader.readBoolOrNull(offsets[16]),
|
||||||
lang: reader.readStringOrNull(offsets[18]),
|
itemType: _SourceitemTypeValueEnumMap[reader.readByteOrNull(offsets[18])] ??
|
||||||
lastUsed: reader.readBoolOrNull(offsets[19]),
|
ItemType.manga,
|
||||||
name: reader.readStringOrNull(offsets[20]),
|
lang: reader.readStringOrNull(offsets[19]),
|
||||||
sourceCode: reader.readStringOrNull(offsets[21]),
|
lastUsed: reader.readBoolOrNull(offsets[20]),
|
||||||
sourceCodeUrl: reader.readStringOrNull(offsets[23]),
|
name: reader.readStringOrNull(offsets[21]),
|
||||||
typeSource: reader.readStringOrNull(offsets[24]),
|
sourceCode: reader.readStringOrNull(offsets[22]),
|
||||||
version: reader.readStringOrNull(offsets[25]),
|
sourceCodeUrl: reader.readStringOrNull(offsets[24]),
|
||||||
versionLast: reader.readStringOrNull(offsets[26]),
|
typeSource: reader.readStringOrNull(offsets[25]),
|
||||||
|
version: reader.readStringOrNull(offsets[26]),
|
||||||
|
versionLast: reader.readStringOrNull(offsets[27]),
|
||||||
);
|
);
|
||||||
object.sourceCodeLanguage = _SourcesourceCodeLanguageValueEnumMap[
|
object.sourceCodeLanguage = _SourcesourceCodeLanguageValueEnumMap[
|
||||||
reader.readByteOrNull(offsets[22])] ??
|
reader.readByteOrNull(offsets[23])] ??
|
||||||
SourceCodeLanguage.dart;
|
SourceCodeLanguage.dart;
|
||||||
return object;
|
return object;
|
||||||
}
|
}
|
||||||
|
|
@ -386,30 +395,43 @@ P _sourceDeserializeProp<P>(
|
||||||
case 17:
|
case 17:
|
||||||
return (reader.readBool(offset)) as P;
|
return (reader.readBool(offset)) as P;
|
||||||
case 18:
|
case 18:
|
||||||
return (reader.readStringOrNull(offset)) as P;
|
return (_SourceitemTypeValueEnumMap[reader.readByteOrNull(offset)] ??
|
||||||
|
ItemType.manga) as P;
|
||||||
case 19:
|
case 19:
|
||||||
return (reader.readBoolOrNull(offset)) as P;
|
|
||||||
case 20:
|
|
||||||
return (reader.readStringOrNull(offset)) as P;
|
return (reader.readStringOrNull(offset)) as P;
|
||||||
|
case 20:
|
||||||
|
return (reader.readBoolOrNull(offset)) as P;
|
||||||
case 21:
|
case 21:
|
||||||
return (reader.readStringOrNull(offset)) as P;
|
return (reader.readStringOrNull(offset)) as P;
|
||||||
case 22:
|
case 22:
|
||||||
|
return (reader.readStringOrNull(offset)) as P;
|
||||||
|
case 23:
|
||||||
return (_SourcesourceCodeLanguageValueEnumMap[
|
return (_SourcesourceCodeLanguageValueEnumMap[
|
||||||
reader.readByteOrNull(offset)] ??
|
reader.readByteOrNull(offset)] ??
|
||||||
SourceCodeLanguage.dart) as P;
|
SourceCodeLanguage.dart) as P;
|
||||||
case 23:
|
|
||||||
return (reader.readStringOrNull(offset)) as P;
|
|
||||||
case 24:
|
case 24:
|
||||||
return (reader.readStringOrNull(offset)) as P;
|
return (reader.readStringOrNull(offset)) as P;
|
||||||
case 25:
|
case 25:
|
||||||
return (reader.readStringOrNull(offset)) as P;
|
return (reader.readStringOrNull(offset)) as P;
|
||||||
case 26:
|
case 26:
|
||||||
return (reader.readStringOrNull(offset)) as P;
|
return (reader.readStringOrNull(offset)) as P;
|
||||||
|
case 27:
|
||||||
|
return (reader.readStringOrNull(offset)) as P;
|
||||||
default:
|
default:
|
||||||
throw IsarError('Unknown property with id $propertyId');
|
throw IsarError('Unknown property with id $propertyId');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const _SourceitemTypeEnumValueMap = {
|
||||||
|
'manga': 0,
|
||||||
|
'anime': 1,
|
||||||
|
'novel': 2,
|
||||||
|
};
|
||||||
|
const _SourceitemTypeValueEnumMap = {
|
||||||
|
0: ItemType.manga,
|
||||||
|
1: ItemType.anime,
|
||||||
|
2: ItemType.novel,
|
||||||
|
};
|
||||||
const _SourcesourceCodeLanguageEnumValueMap = {
|
const _SourcesourceCodeLanguageEnumValueMap = {
|
||||||
'dart': 0,
|
'dart': 0,
|
||||||
'javascript': 1,
|
'javascript': 1,
|
||||||
|
|
@ -1997,6 +2019,59 @@ extension SourceQueryFilter on QueryBuilder<Source, Source, QFilterCondition> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Source, Source, QAfterFilterCondition> itemTypeEqualTo(
|
||||||
|
ItemType value) {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addFilterCondition(FilterCondition.equalTo(
|
||||||
|
property: r'itemType',
|
||||||
|
value: value,
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Source, Source, QAfterFilterCondition> itemTypeGreaterThan(
|
||||||
|
ItemType value, {
|
||||||
|
bool include = false,
|
||||||
|
}) {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addFilterCondition(FilterCondition.greaterThan(
|
||||||
|
include: include,
|
||||||
|
property: r'itemType',
|
||||||
|
value: value,
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Source, Source, QAfterFilterCondition> itemTypeLessThan(
|
||||||
|
ItemType value, {
|
||||||
|
bool include = false,
|
||||||
|
}) {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addFilterCondition(FilterCondition.lessThan(
|
||||||
|
include: include,
|
||||||
|
property: r'itemType',
|
||||||
|
value: value,
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Source, Source, QAfterFilterCondition> itemTypeBetween(
|
||||||
|
ItemType lower,
|
||||||
|
ItemType upper, {
|
||||||
|
bool includeLower = true,
|
||||||
|
bool includeUpper = true,
|
||||||
|
}) {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addFilterCondition(FilterCondition.between(
|
||||||
|
property: r'itemType',
|
||||||
|
lower: lower,
|
||||||
|
includeLower: includeLower,
|
||||||
|
upper: upper,
|
||||||
|
includeUpper: includeUpper,
|
||||||
|
));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
QueryBuilder<Source, Source, QAfterFilterCondition> langIsNull() {
|
QueryBuilder<Source, Source, QAfterFilterCondition> langIsNull() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addFilterCondition(const FilterCondition.isNull(
|
return query.addFilterCondition(const FilterCondition.isNull(
|
||||||
|
|
@ -3321,6 +3396,18 @@ extension SourceQuerySortBy on QueryBuilder<Source, Source, QSortBy> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Source, Source, QAfterSortBy> sortByItemType() {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addSortBy(r'itemType', Sort.asc);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Source, Source, QAfterSortBy> sortByItemTypeDesc() {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addSortBy(r'itemType', Sort.desc);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
QueryBuilder<Source, Source, QAfterSortBy> sortByLang() {
|
QueryBuilder<Source, Source, QAfterSortBy> sortByLang() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'lang', Sort.asc);
|
return query.addSortBy(r'lang', Sort.asc);
|
||||||
|
|
@ -3659,6 +3746,18 @@ extension SourceQuerySortThenBy on QueryBuilder<Source, Source, QSortThenBy> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Source, Source, QAfterSortBy> thenByItemType() {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addSortBy(r'itemType', Sort.asc);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Source, Source, QAfterSortBy> thenByItemTypeDesc() {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addSortBy(r'itemType', Sort.desc);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
QueryBuilder<Source, Source, QAfterSortBy> thenByLang() {
|
QueryBuilder<Source, Source, QAfterSortBy> thenByLang() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addSortBy(r'lang', Sort.asc);
|
return query.addSortBy(r'lang', Sort.asc);
|
||||||
|
|
@ -3887,6 +3986,12 @@ extension SourceQueryWhereDistinct on QueryBuilder<Source, Source, QDistinct> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Source, Source, QDistinct> distinctByItemType() {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addDistinctBy(r'itemType');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
QueryBuilder<Source, Source, QDistinct> distinctByLang(
|
QueryBuilder<Source, Source, QDistinct> distinctByLang(
|
||||||
{bool caseSensitive = true}) {
|
{bool caseSensitive = true}) {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
|
@ -4065,6 +4170,12 @@ extension SourceQueryProperty on QueryBuilder<Source, Source, QQueryProperty> {
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QueryBuilder<Source, ItemType, QQueryOperations> itemTypeProperty() {
|
||||||
|
return QueryBuilder.apply(this, (query) {
|
||||||
|
return query.addPropertyName(r'itemType');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
QueryBuilder<Source, String?, QQueryOperations> langProperty() {
|
QueryBuilder<Source, String?, QQueryOperations> langProperty() {
|
||||||
return QueryBuilder.apply(this, (query) {
|
return QueryBuilder.apply(this, (query) {
|
||||||
return query.addPropertyName(r'lang');
|
return query.addPropertyName(r'lang');
|
||||||
|
|
|
||||||
|
|
@ -133,7 +133,7 @@ class AnimeStreamController extends _$AnimeStreamController {
|
||||||
history = History(
|
history = History(
|
||||||
mangaId: getAnime().id,
|
mangaId: getAnime().id,
|
||||||
date: DateTime.now().millisecondsSinceEpoch.toString(),
|
date: DateTime.now().millisecondsSinceEpoch.toString(),
|
||||||
isManga: getAnime().isManga,
|
itemType: getAnime().itemType,
|
||||||
chapterId: episode.id)
|
chapterId: episode.id)
|
||||||
..chapter.value = episode;
|
..chapter.value = episode;
|
||||||
} else {
|
} else {
|
||||||
|
|
|
||||||
|
|
@ -7,7 +7,7 @@ part of 'anime_player_controller_provider.dart';
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$animeStreamControllerHash() =>
|
String _$animeStreamControllerHash() =>
|
||||||
r'0d97207a4d015d5089766ccbeeba093c55cb1ef9';
|
r'd3ec7fe7ac2af84393b128e430fd2f5b9224ed14';
|
||||||
|
|
||||||
/// Copied from Dart SDK
|
/// Copied from Dart SDK
|
||||||
class _SystemHash {
|
class _SystemHash {
|
||||||
|
|
|
||||||
|
|
@ -236,7 +236,7 @@ class _MangaGlobalImageCardState extends ConsumerState<MangaGlobalImageCard>
|
||||||
context: context,
|
context: context,
|
||||||
getManga: getMangaDetail,
|
getManga: getMangaDetail,
|
||||||
lang: widget.source.lang!,
|
lang: widget.source.lang!,
|
||||||
isManga: widget.source.isManga ?? true,
|
itemType: widget.source.itemType,
|
||||||
useMaterialRoute: true,
|
useMaterialRoute: true,
|
||||||
source: widget.source.name!);
|
source: widget.source.name!);
|
||||||
},
|
},
|
||||||
|
|
|
||||||
|
|
@ -119,10 +119,14 @@ class _HistoryScreenState extends ConsumerState<HistoryScreen>
|
||||||
List<History> histories = isar.historys
|
List<History> histories = isar.historys
|
||||||
.filter()
|
.filter()
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.chapter((q) => q.manga((q) =>
|
.chapter((q) => q.manga((q) => q
|
||||||
q.isMangaEqualTo(
|
.itemTypeEqualTo(_tabBarController
|
||||||
_tabBarController.index ==
|
.index ==
|
||||||
0)))
|
0
|
||||||
|
? ItemType.manga
|
||||||
|
: _tabBarController.index == 1
|
||||||
|
? ItemType.anime
|
||||||
|
: ItemType.novel)))
|
||||||
.findAllSync()
|
.findAllSync()
|
||||||
.toList();
|
.toList();
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
|
|
@ -150,6 +154,7 @@ class _HistoryScreenState extends ConsumerState<HistoryScreen>
|
||||||
tabs: [
|
tabs: [
|
||||||
Tab(text: l10n.manga),
|
Tab(text: l10n.manga),
|
||||||
Tab(text: l10n.anime),
|
Tab(text: l10n.anime),
|
||||||
|
Tab(text: l10n.novel),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -157,11 +162,15 @@ class _HistoryScreenState extends ConsumerState<HistoryScreen>
|
||||||
padding: const EdgeInsets.only(top: 10),
|
padding: const EdgeInsets.only(top: 10),
|
||||||
child: TabBarView(controller: _tabBarController, children: [
|
child: TabBarView(controller: _tabBarController, children: [
|
||||||
HistoryTab(
|
HistoryTab(
|
||||||
isManga: true,
|
itemType: ItemType.manga,
|
||||||
query: _textEditingController.text,
|
query: _textEditingController.text,
|
||||||
),
|
),
|
||||||
HistoryTab(
|
HistoryTab(
|
||||||
isManga: false,
|
itemType: ItemType.anime,
|
||||||
|
query: _textEditingController.text,
|
||||||
|
),
|
||||||
|
HistoryTab(
|
||||||
|
itemType: ItemType.novel,
|
||||||
query: _textEditingController.text,
|
query: _textEditingController.text,
|
||||||
)
|
)
|
||||||
]),
|
]),
|
||||||
|
|
@ -173,8 +182,8 @@ class _HistoryScreenState extends ConsumerState<HistoryScreen>
|
||||||
|
|
||||||
class HistoryTab extends ConsumerStatefulWidget {
|
class HistoryTab extends ConsumerStatefulWidget {
|
||||||
final String query;
|
final String query;
|
||||||
final bool isManga;
|
final ItemType itemType;
|
||||||
const HistoryTab({required this.isManga, required this.query, super.key});
|
const HistoryTab({required this.itemType, required this.query, super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
ConsumerState<HistoryTab> createState() => _HistoryTabState();
|
ConsumerState<HistoryTab> createState() => _HistoryTabState();
|
||||||
|
|
@ -185,7 +194,7 @@ class _HistoryTabState extends ConsumerState<HistoryTab> {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final l10n = l10nLocalizations(context)!;
|
final l10n = l10nLocalizations(context)!;
|
||||||
final history =
|
final history =
|
||||||
ref.watch(getAllHistoryStreamProvider(isManga: widget.isManga));
|
ref.watch(getAllHistoryStreamProvider(itemType: widget.itemType));
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
body: history.when(
|
body: history.when(
|
||||||
data: (data) {
|
data: (data) {
|
||||||
|
|
|
||||||
|
|
@ -10,22 +10,22 @@ part 'isar_providers.g.dart';
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
Stream<List<History>> getAllHistoryStream(Ref ref,
|
Stream<List<History>> getAllHistoryStream(Ref ref,
|
||||||
{required bool isManga}) async* {
|
{required ItemType itemType}) async* {
|
||||||
yield* isar.historys
|
yield* isar.historys
|
||||||
.filter()
|
.filter()
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.and()
|
.and()
|
||||||
.chapter((q) => q.manga((q) => q.isMangaEqualTo(isManga)))
|
.chapter((q) => q.manga((q) => q.itemTypeEqualTo(itemType)))
|
||||||
.watch(fireImmediately: true);
|
.watch(fireImmediately: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
Stream<List<Update>> getAllUpdateStream(Ref ref,
|
Stream<List<Update>> getAllUpdateStream(Ref ref,
|
||||||
{required bool isManga}) async* {
|
{required ItemType itemType}) async* {
|
||||||
yield* isar.updates
|
yield* isar.updates
|
||||||
.filter()
|
.filter()
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.and()
|
.and()
|
||||||
.chapter((q) => q.manga((q) => q.isMangaEqualTo(isManga)))
|
.chapter((q) => q.manga((q) => q.itemTypeEqualTo(itemType)))
|
||||||
.watch(fireImmediately: true);
|
.watch(fireImmediately: true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,10 +41,10 @@ class GetAllHistoryStreamFamily extends Family<AsyncValue<List<History>>> {
|
||||||
|
|
||||||
/// See also [getAllHistoryStream].
|
/// See also [getAllHistoryStream].
|
||||||
GetAllHistoryStreamProvider call({
|
GetAllHistoryStreamProvider call({
|
||||||
required bool isManga,
|
required ItemType itemType,
|
||||||
}) {
|
}) {
|
||||||
return GetAllHistoryStreamProvider(
|
return GetAllHistoryStreamProvider(
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -53,7 +53,7 @@ class GetAllHistoryStreamFamily extends Family<AsyncValue<List<History>>> {
|
||||||
covariant GetAllHistoryStreamProvider provider,
|
covariant GetAllHistoryStreamProvider provider,
|
||||||
) {
|
) {
|
||||||
return call(
|
return call(
|
||||||
isManga: provider.isManga,
|
itemType: provider.itemType,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -77,11 +77,11 @@ class GetAllHistoryStreamProvider
|
||||||
extends AutoDisposeStreamProvider<List<History>> {
|
extends AutoDisposeStreamProvider<List<History>> {
|
||||||
/// See also [getAllHistoryStream].
|
/// See also [getAllHistoryStream].
|
||||||
GetAllHistoryStreamProvider({
|
GetAllHistoryStreamProvider({
|
||||||
required bool isManga,
|
required ItemType itemType,
|
||||||
}) : this._internal(
|
}) : this._internal(
|
||||||
(ref) => getAllHistoryStream(
|
(ref) => getAllHistoryStream(
|
||||||
ref as GetAllHistoryStreamRef,
|
ref as GetAllHistoryStreamRef,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
),
|
),
|
||||||
from: getAllHistoryStreamProvider,
|
from: getAllHistoryStreamProvider,
|
||||||
name: r'getAllHistoryStreamProvider',
|
name: r'getAllHistoryStreamProvider',
|
||||||
|
|
@ -92,7 +92,7 @@ class GetAllHistoryStreamProvider
|
||||||
dependencies: GetAllHistoryStreamFamily._dependencies,
|
dependencies: GetAllHistoryStreamFamily._dependencies,
|
||||||
allTransitiveDependencies:
|
allTransitiveDependencies:
|
||||||
GetAllHistoryStreamFamily._allTransitiveDependencies,
|
GetAllHistoryStreamFamily._allTransitiveDependencies,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
);
|
);
|
||||||
|
|
||||||
GetAllHistoryStreamProvider._internal(
|
GetAllHistoryStreamProvider._internal(
|
||||||
|
|
@ -102,10 +102,10 @@ class GetAllHistoryStreamProvider
|
||||||
required super.allTransitiveDependencies,
|
required super.allTransitiveDependencies,
|
||||||
required super.debugGetCreateSourceHash,
|
required super.debugGetCreateSourceHash,
|
||||||
required super.from,
|
required super.from,
|
||||||
required this.isManga,
|
required this.itemType,
|
||||||
}) : super.internal();
|
}) : super.internal();
|
||||||
|
|
||||||
final bool isManga;
|
final ItemType itemType;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Override overrideWith(
|
Override overrideWith(
|
||||||
|
|
@ -120,7 +120,7 @@ class GetAllHistoryStreamProvider
|
||||||
dependencies: null,
|
dependencies: null,
|
||||||
allTransitiveDependencies: null,
|
allTransitiveDependencies: null,
|
||||||
debugGetCreateSourceHash: null,
|
debugGetCreateSourceHash: null,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -132,13 +132,13 @@ class GetAllHistoryStreamProvider
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) {
|
bool operator ==(Object other) {
|
||||||
return other is GetAllHistoryStreamProvider && other.isManga == isManga;
|
return other is GetAllHistoryStreamProvider && other.itemType == itemType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode {
|
int get hashCode {
|
||||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||||
hash = _SystemHash.combine(hash, isManga.hashCode);
|
hash = _SystemHash.combine(hash, itemType.hashCode);
|
||||||
|
|
||||||
return _SystemHash.finish(hash);
|
return _SystemHash.finish(hash);
|
||||||
}
|
}
|
||||||
|
|
@ -147,8 +147,8 @@ class GetAllHistoryStreamProvider
|
||||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
mixin GetAllHistoryStreamRef on AutoDisposeStreamProviderRef<List<History>> {
|
mixin GetAllHistoryStreamRef on AutoDisposeStreamProviderRef<List<History>> {
|
||||||
/// The parameter `isManga` of this provider.
|
/// The parameter `itemType` of this provider.
|
||||||
bool get isManga;
|
ItemType get itemType;
|
||||||
}
|
}
|
||||||
|
|
||||||
class _GetAllHistoryStreamProviderElement
|
class _GetAllHistoryStreamProviderElement
|
||||||
|
|
@ -157,7 +157,7 @@ class _GetAllHistoryStreamProviderElement
|
||||||
_GetAllHistoryStreamProviderElement(super.provider);
|
_GetAllHistoryStreamProviderElement(super.provider);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get isManga => (origin as GetAllHistoryStreamProvider).isManga;
|
ItemType get itemType => (origin as GetAllHistoryStreamProvider).itemType;
|
||||||
}
|
}
|
||||||
|
|
||||||
String _$getAllUpdateStreamHash() =>
|
String _$getAllUpdateStreamHash() =>
|
||||||
|
|
@ -174,10 +174,10 @@ class GetAllUpdateStreamFamily extends Family<AsyncValue<List<Update>>> {
|
||||||
|
|
||||||
/// See also [getAllUpdateStream].
|
/// See also [getAllUpdateStream].
|
||||||
GetAllUpdateStreamProvider call({
|
GetAllUpdateStreamProvider call({
|
||||||
required bool isManga,
|
required ItemType itemType,
|
||||||
}) {
|
}) {
|
||||||
return GetAllUpdateStreamProvider(
|
return GetAllUpdateStreamProvider(
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -186,7 +186,7 @@ class GetAllUpdateStreamFamily extends Family<AsyncValue<List<Update>>> {
|
||||||
covariant GetAllUpdateStreamProvider provider,
|
covariant GetAllUpdateStreamProvider provider,
|
||||||
) {
|
) {
|
||||||
return call(
|
return call(
|
||||||
isManga: provider.isManga,
|
itemType: provider.itemType,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -210,11 +210,11 @@ class GetAllUpdateStreamProvider
|
||||||
extends AutoDisposeStreamProvider<List<Update>> {
|
extends AutoDisposeStreamProvider<List<Update>> {
|
||||||
/// See also [getAllUpdateStream].
|
/// See also [getAllUpdateStream].
|
||||||
GetAllUpdateStreamProvider({
|
GetAllUpdateStreamProvider({
|
||||||
required bool isManga,
|
required ItemType itemType,
|
||||||
}) : this._internal(
|
}) : this._internal(
|
||||||
(ref) => getAllUpdateStream(
|
(ref) => getAllUpdateStream(
|
||||||
ref as GetAllUpdateStreamRef,
|
ref as GetAllUpdateStreamRef,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
),
|
),
|
||||||
from: getAllUpdateStreamProvider,
|
from: getAllUpdateStreamProvider,
|
||||||
name: r'getAllUpdateStreamProvider',
|
name: r'getAllUpdateStreamProvider',
|
||||||
|
|
@ -225,7 +225,7 @@ class GetAllUpdateStreamProvider
|
||||||
dependencies: GetAllUpdateStreamFamily._dependencies,
|
dependencies: GetAllUpdateStreamFamily._dependencies,
|
||||||
allTransitiveDependencies:
|
allTransitiveDependencies:
|
||||||
GetAllUpdateStreamFamily._allTransitiveDependencies,
|
GetAllUpdateStreamFamily._allTransitiveDependencies,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
);
|
);
|
||||||
|
|
||||||
GetAllUpdateStreamProvider._internal(
|
GetAllUpdateStreamProvider._internal(
|
||||||
|
|
@ -235,10 +235,10 @@ class GetAllUpdateStreamProvider
|
||||||
required super.allTransitiveDependencies,
|
required super.allTransitiveDependencies,
|
||||||
required super.debugGetCreateSourceHash,
|
required super.debugGetCreateSourceHash,
|
||||||
required super.from,
|
required super.from,
|
||||||
required this.isManga,
|
required this.itemType,
|
||||||
}) : super.internal();
|
}) : super.internal();
|
||||||
|
|
||||||
final bool isManga;
|
final ItemType itemType;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Override overrideWith(
|
Override overrideWith(
|
||||||
|
|
@ -253,7 +253,7 @@ class GetAllUpdateStreamProvider
|
||||||
dependencies: null,
|
dependencies: null,
|
||||||
allTransitiveDependencies: null,
|
allTransitiveDependencies: null,
|
||||||
debugGetCreateSourceHash: null,
|
debugGetCreateSourceHash: null,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -265,13 +265,13 @@ class GetAllUpdateStreamProvider
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) {
|
bool operator ==(Object other) {
|
||||||
return other is GetAllUpdateStreamProvider && other.isManga == isManga;
|
return other is GetAllUpdateStreamProvider && other.itemType == itemType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode {
|
int get hashCode {
|
||||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||||
hash = _SystemHash.combine(hash, isManga.hashCode);
|
hash = _SystemHash.combine(hash, itemType.hashCode);
|
||||||
|
|
||||||
return _SystemHash.finish(hash);
|
return _SystemHash.finish(hash);
|
||||||
}
|
}
|
||||||
|
|
@ -280,8 +280,8 @@ class GetAllUpdateStreamProvider
|
||||||
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
@Deprecated('Will be removed in 3.0. Use Ref instead')
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
mixin GetAllUpdateStreamRef on AutoDisposeStreamProviderRef<List<Update>> {
|
mixin GetAllUpdateStreamRef on AutoDisposeStreamProviderRef<List<Update>> {
|
||||||
/// The parameter `isManga` of this provider.
|
/// The parameter `itemType` of this provider.
|
||||||
bool get isManga;
|
ItemType get itemType;
|
||||||
}
|
}
|
||||||
|
|
||||||
class _GetAllUpdateStreamProviderElement
|
class _GetAllUpdateStreamProviderElement
|
||||||
|
|
@ -290,7 +290,7 @@ class _GetAllUpdateStreamProviderElement
|
||||||
_GetAllUpdateStreamProviderElement(super.provider);
|
_GetAllUpdateStreamProviderElement(super.provider);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get isManga => (origin as GetAllUpdateStreamProvider).isManga;
|
ItemType get itemType => (origin as GetAllUpdateStreamProvider).itemType;
|
||||||
}
|
}
|
||||||
// ignore_for_file: type=lint
|
// 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
|
// 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
|
||||||
|
|
|
||||||
|
|
@ -40,8 +40,8 @@ import 'package:mangayomi/modules/widgets/progress_center.dart';
|
||||||
import 'package:mangayomi/utils/global_style.dart';
|
import 'package:mangayomi/utils/global_style.dart';
|
||||||
|
|
||||||
class LibraryScreen extends ConsumerStatefulWidget {
|
class LibraryScreen extends ConsumerStatefulWidget {
|
||||||
final bool isManga;
|
final ItemType itemType;
|
||||||
const LibraryScreen({required this.isManga, super.key});
|
const LibraryScreen({required this.itemType, super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
ConsumerState<LibraryScreen> createState() => _LibraryScreenState();
|
ConsumerState<LibraryScreen> createState() => _LibraryScreenState();
|
||||||
|
|
@ -83,13 +83,13 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
final settings = settingsList.first;
|
final settings = settingsList.first;
|
||||||
|
|
||||||
final categories =
|
final categories =
|
||||||
ref.watch(getMangaCategorieStreamProvider(isManga: widget.isManga));
|
ref.watch(getMangaCategorieStreamProvider(itemType: widget.itemType));
|
||||||
final withoutCategories = ref.watch(
|
final withoutCategories = ref.watch(
|
||||||
getAllMangaWithoutCategoriesStreamProvider(isManga: widget.isManga));
|
getAllMangaWithoutCategoriesStreamProvider(itemType: widget.itemType));
|
||||||
final showCategoryTabs = ref.watch(libraryShowCategoryTabsStateProvider(
|
final showCategoryTabs = ref.watch(libraryShowCategoryTabsStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final mangaAll = ref.watch(
|
final mangaAll = ref.watch(
|
||||||
getAllMangaStreamProvider(categoryId: null, isManga: widget.isManga));
|
getAllMangaStreamProvider(categoryId: null, itemType: widget.itemType));
|
||||||
final l10n = l10nLocalizations(context)!;
|
final l10n = l10nLocalizations(context)!;
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
body: mangaAll.when(
|
body: mangaAll.when(
|
||||||
|
|
@ -113,55 +113,55 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
return Consumer(builder: (context, ref, child) {
|
return Consumer(builder: (context, ref, child) {
|
||||||
bool reverse = ref
|
bool reverse = ref
|
||||||
.watch(sortLibraryMangaStateProvider(
|
.watch(sortLibraryMangaStateProvider(
|
||||||
isManga: widget.isManga, settings: settings))
|
itemType: widget.itemType, settings: settings))
|
||||||
.reverse!;
|
.reverse!;
|
||||||
|
|
||||||
final continueReaderBtn = ref.watch(
|
final continueReaderBtn = ref.watch(
|
||||||
libraryShowContinueReadingButtonStateProvider(
|
libraryShowContinueReadingButtonStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final showNumbersOfItems = ref.watch(
|
final showNumbersOfItems = ref.watch(
|
||||||
libraryShowNumbersOfItemsStateProvider(
|
libraryShowNumbersOfItemsStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final localSource = ref.watch(
|
final localSource = ref.watch(
|
||||||
libraryLocalSourceStateProvider(
|
libraryLocalSourceStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final downloadedChapter = ref.watch(
|
final downloadedChapter = ref.watch(
|
||||||
libraryDownloadedChaptersStateProvider(
|
libraryDownloadedChaptersStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final language = ref.watch(
|
final language = ref.watch(
|
||||||
libraryLanguageStateProvider(
|
libraryLanguageStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final displayType = ref.watch(
|
final displayType = ref.watch(
|
||||||
libraryDisplayTypeStateProvider(
|
libraryDisplayTypeStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final isNotFiltering = ref.watch(
|
final isNotFiltering = ref.watch(
|
||||||
mangasFilterResultStateProvider(
|
mangasFilterResultStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings));
|
settings: settings));
|
||||||
final downloadFilterType = ref.watch(
|
final downloadFilterType = ref.watch(
|
||||||
mangaFilterDownloadedStateProvider(
|
mangaFilterDownloadedStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings));
|
settings: settings));
|
||||||
final unreadFilterType = ref.watch(
|
final unreadFilterType = ref.watch(
|
||||||
mangaFilterUnreadStateProvider(
|
mangaFilterUnreadStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings));
|
settings: settings));
|
||||||
final startedFilterType = ref.watch(
|
final startedFilterType = ref.watch(
|
||||||
mangaFilterStartedStateProvider(
|
mangaFilterStartedStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings));
|
settings: settings));
|
||||||
final bookmarkedFilterType = ref.watch(
|
final bookmarkedFilterType = ref.watch(
|
||||||
mangaFilterBookmarkedStateProvider(
|
mangaFilterBookmarkedStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings));
|
settings: settings));
|
||||||
final sortType = ref
|
final sortType = ref
|
||||||
.watch(sortLibraryMangaStateProvider(
|
.watch(sortLibraryMangaStateProvider(
|
||||||
isManga: widget.isManga, settings: settings))
|
itemType: widget.itemType, settings: settings))
|
||||||
.index as int;
|
.index as int;
|
||||||
final numberOfItemsList = _filterAndSortManga(
|
final numberOfItemsList = _filterAndSortManga(
|
||||||
data: man,
|
data: man,
|
||||||
|
|
@ -364,53 +364,53 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
return Consumer(builder: (context, ref, child) {
|
return Consumer(builder: (context, ref, child) {
|
||||||
bool reverse = ref
|
bool reverse = ref
|
||||||
.watch(sortLibraryMangaStateProvider(
|
.watch(sortLibraryMangaStateProvider(
|
||||||
isManga: widget.isManga, settings: settings))
|
itemType: widget.itemType, settings: settings))
|
||||||
.reverse!;
|
.reverse!;
|
||||||
final continueReaderBtn = ref.watch(
|
final continueReaderBtn = ref.watch(
|
||||||
libraryShowContinueReadingButtonStateProvider(
|
libraryShowContinueReadingButtonStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final showNumbersOfItems = ref.watch(
|
final showNumbersOfItems = ref.watch(
|
||||||
libraryShowNumbersOfItemsStateProvider(
|
libraryShowNumbersOfItemsStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final localSource = ref.watch(
|
final localSource = ref.watch(
|
||||||
libraryLocalSourceStateProvider(
|
libraryLocalSourceStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final downloadedChapter = ref.watch(
|
final downloadedChapter = ref.watch(
|
||||||
libraryDownloadedChaptersStateProvider(
|
libraryDownloadedChaptersStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final language = ref.watch(libraryLanguageStateProvider(
|
final language = ref.watch(libraryLanguageStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final displayType = ref.watch(
|
final displayType = ref.watch(
|
||||||
libraryDisplayTypeStateProvider(
|
libraryDisplayTypeStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final isNotFiltering = ref.watch(
|
final isNotFiltering = ref.watch(
|
||||||
mangasFilterResultStateProvider(
|
mangasFilterResultStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings));
|
settings: settings));
|
||||||
final downloadFilterType = ref.watch(
|
final downloadFilterType = ref.watch(
|
||||||
mangaFilterDownloadedStateProvider(
|
mangaFilterDownloadedStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings));
|
settings: settings));
|
||||||
final unreadFilterType = ref.watch(
|
final unreadFilterType = ref.watch(
|
||||||
mangaFilterUnreadStateProvider(
|
mangaFilterUnreadStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings));
|
settings: settings));
|
||||||
final startedFilterType = ref.watch(
|
final startedFilterType = ref.watch(
|
||||||
mangaFilterStartedStateProvider(
|
mangaFilterStartedStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings));
|
settings: settings));
|
||||||
final bookmarkedFilterType = ref.watch(
|
final bookmarkedFilterType = ref.watch(
|
||||||
mangaFilterBookmarkedStateProvider(
|
mangaFilterBookmarkedStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings));
|
settings: settings));
|
||||||
final sortType = ref
|
final sortType = ref
|
||||||
.watch(sortLibraryMangaStateProvider(
|
.watch(sortLibraryMangaStateProvider(
|
||||||
isManga: widget.isManga, settings: settings))
|
itemType: widget.itemType, settings: settings))
|
||||||
.index;
|
.index;
|
||||||
final numberOfItemsList = _filterAndSortManga(
|
final numberOfItemsList = _filterAndSortManga(
|
||||||
data: man,
|
data: man,
|
||||||
|
|
@ -518,9 +518,9 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
.set();
|
.set();
|
||||||
ref.invalidate(
|
ref.invalidate(
|
||||||
getAllMangaWithoutCategoriesStreamProvider(
|
getAllMangaWithoutCategoriesStreamProvider(
|
||||||
isManga: widget.isManga));
|
itemType: widget.itemType));
|
||||||
ref.invalidate(getAllMangaStreamProvider(
|
ref.invalidate(getAllMangaStreamProvider(
|
||||||
categoryId: null, isManga: widget.isManga));
|
categoryId: null, itemType: widget.itemType));
|
||||||
},
|
},
|
||||||
child: Icon(
|
child: Icon(
|
||||||
Icons.done_all_sharp,
|
Icons.done_all_sharp,
|
||||||
|
|
@ -545,9 +545,9 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
.set();
|
.set();
|
||||||
ref.invalidate(
|
ref.invalidate(
|
||||||
getAllMangaWithoutCategoriesStreamProvider(
|
getAllMangaWithoutCategoriesStreamProvider(
|
||||||
isManga: widget.isManga));
|
itemType: widget.itemType));
|
||||||
ref.invalidate(getAllMangaStreamProvider(
|
ref.invalidate(getAllMangaStreamProvider(
|
||||||
categoryId: null, isManga: widget.isManga));
|
categoryId: null, itemType: widget.itemType));
|
||||||
},
|
},
|
||||||
child: Icon(
|
child: Icon(
|
||||||
Icons.remove_done_sharp,
|
Icons.remove_done_sharp,
|
||||||
|
|
@ -611,10 +611,10 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
required int categoryId,
|
required int categoryId,
|
||||||
required Settings settings}) {
|
required Settings settings}) {
|
||||||
final mangas = ref.watch(getAllMangaStreamProvider(
|
final mangas = ref.watch(getAllMangaStreamProvider(
|
||||||
categoryId: categoryId, isManga: widget.isManga));
|
categoryId: categoryId, itemType: widget.itemType));
|
||||||
final sortType = ref
|
final sortType = ref
|
||||||
.watch(sortLibraryMangaStateProvider(
|
.watch(sortLibraryMangaStateProvider(
|
||||||
isManga: widget.isManga, settings: settings))
|
itemType: widget.itemType, settings: settings))
|
||||||
.index;
|
.index;
|
||||||
return mangas.when(
|
return mangas.when(
|
||||||
data: (data) {
|
data: (data) {
|
||||||
|
|
@ -661,10 +661,10 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
required Settings settings}) {
|
required Settings settings}) {
|
||||||
final l10n = l10nLocalizations(context)!;
|
final l10n = l10nLocalizations(context)!;
|
||||||
final mangas = ref.watch(getAllMangaStreamProvider(
|
final mangas = ref.watch(getAllMangaStreamProvider(
|
||||||
categoryId: categoryId, isManga: widget.isManga));
|
categoryId: categoryId, itemType: widget.itemType));
|
||||||
final sortType = ref
|
final sortType = ref
|
||||||
.watch(sortLibraryMangaStateProvider(
|
.watch(sortLibraryMangaStateProvider(
|
||||||
isManga: widget.isManga, settings: settings))
|
itemType: widget.itemType, settings: settings))
|
||||||
.index;
|
.index;
|
||||||
final mangaIdsList = ref.watch(mangasListStateProvider);
|
final mangaIdsList = ref.watch(mangasListStateProvider);
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
|
|
@ -702,7 +702,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
language: language,
|
language: language,
|
||||||
mangaIdsList: mangaIdsList,
|
mangaIdsList: mangaIdsList,
|
||||||
localSource: localSource,
|
localSource: localSource,
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -733,13 +733,13 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
required Settings settings}) {
|
required Settings settings}) {
|
||||||
final sortType = ref
|
final sortType = ref
|
||||||
.watch(sortLibraryMangaStateProvider(
|
.watch(sortLibraryMangaStateProvider(
|
||||||
isManga: widget.isManga, settings: settings))
|
itemType: widget.itemType, settings: settings))
|
||||||
.index;
|
.index;
|
||||||
final manga = withouCategories
|
final manga = withouCategories
|
||||||
? ref.watch(
|
? ref.watch(
|
||||||
getAllMangaWithoutCategoriesStreamProvider(isManga: widget.isManga))
|
getAllMangaWithoutCategoriesStreamProvider(itemType: widget.itemType))
|
||||||
: ref.watch(getAllMangaStreamProvider(
|
: ref.watch(getAllMangaStreamProvider(
|
||||||
categoryId: null, isManga: widget.isManga));
|
categoryId: null, itemType: widget.itemType));
|
||||||
final mangaIdsList = ref.watch(mangasListStateProvider);
|
final mangaIdsList = ref.watch(mangasListStateProvider);
|
||||||
final l10n = l10nLocalizations(context)!;
|
final l10n = l10nLocalizations(context)!;
|
||||||
return manga.when(
|
return manga.when(
|
||||||
|
|
@ -776,7 +776,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
language: language,
|
language: language,
|
||||||
mangaIdsList: mangaIdsList,
|
mangaIdsList: mangaIdsList,
|
||||||
localSource: localSource,
|
localSource: localSource,
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -954,7 +954,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
.filter()
|
.filter()
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.and()
|
.and()
|
||||||
.forMangaEqualTo(widget.isManga)
|
.forItemTypeEqualTo(widget.itemType)
|
||||||
.watch(fireImmediately: true),
|
.watch(fireImmediately: true),
|
||||||
builder: (context, snapshot) {
|
builder: (context, snapshot) {
|
||||||
return AlertDialog(
|
return AlertDialog(
|
||||||
|
|
@ -1006,7 +1006,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
context.push("/categories", extra: (
|
context.push("/categories", extra: (
|
||||||
true,
|
true,
|
||||||
widget.isManga ? 0 : 1
|
widget.itemType
|
||||||
));
|
));
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
|
|
@ -1059,7 +1059,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
context.push("/categories", extra: (
|
context.push("/categories", extra: (
|
||||||
true,
|
true,
|
||||||
widget.isManga ? 0 : 1
|
widget.itemType
|
||||||
));
|
));
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
|
|
@ -1270,13 +1270,13 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
ListTileChapterFilter(
|
ListTileChapterFilter(
|
||||||
label: l10n.downloaded,
|
label: l10n.downloaded,
|
||||||
type: ref.watch(mangaFilterDownloadedStateProvider(
|
type: ref.watch(mangaFilterDownloadedStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings)),
|
settings: settings)),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
ref
|
ref
|
||||||
.read(mangaFilterDownloadedStateProvider(
|
.read(mangaFilterDownloadedStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings)
|
settings: settings)
|
||||||
.notifier)
|
.notifier)
|
||||||
|
|
@ -1285,13 +1285,13 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
ListTileChapterFilter(
|
ListTileChapterFilter(
|
||||||
label: l10n.unread,
|
label: l10n.unread,
|
||||||
type: ref.watch(mangaFilterUnreadStateProvider(
|
type: ref.watch(mangaFilterUnreadStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings)),
|
settings: settings)),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
ref
|
ref
|
||||||
.read(mangaFilterUnreadStateProvider(
|
.read(mangaFilterUnreadStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings)
|
settings: settings)
|
||||||
.notifier)
|
.notifier)
|
||||||
|
|
@ -1300,13 +1300,13 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
ListTileChapterFilter(
|
ListTileChapterFilter(
|
||||||
label: l10n.started,
|
label: l10n.started,
|
||||||
type: ref.watch(mangaFilterStartedStateProvider(
|
type: ref.watch(mangaFilterStartedStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings)),
|
settings: settings)),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
ref
|
ref
|
||||||
.read(mangaFilterStartedStateProvider(
|
.read(mangaFilterStartedStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings)
|
settings: settings)
|
||||||
.notifier)
|
.notifier)
|
||||||
|
|
@ -1315,14 +1315,14 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
ListTileChapterFilter(
|
ListTileChapterFilter(
|
||||||
label: l10n.bookmarked,
|
label: l10n.bookmarked,
|
||||||
type: ref.watch(mangaFilterBookmarkedStateProvider(
|
type: ref.watch(mangaFilterBookmarkedStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings)),
|
settings: settings)),
|
||||||
onTap: () {
|
onTap: () {
|
||||||
setState(() {
|
setState(() {
|
||||||
ref
|
ref
|
||||||
.read(mangaFilterBookmarkedStateProvider(
|
.read(mangaFilterBookmarkedStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
mangaList: _entries,
|
mangaList: _entries,
|
||||||
settings: settings)
|
settings: settings)
|
||||||
.notifier)
|
.notifier)
|
||||||
|
|
@ -1335,11 +1335,11 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
Consumer(builder: (context, ref, chil) {
|
Consumer(builder: (context, ref, chil) {
|
||||||
final reverse = ref
|
final reverse = ref
|
||||||
.read(sortLibraryMangaStateProvider(
|
.read(sortLibraryMangaStateProvider(
|
||||||
isManga: widget.isManga, settings: settings)
|
itemType: widget.itemType, settings: settings)
|
||||||
.notifier)
|
.notifier)
|
||||||
.isReverse();
|
.isReverse();
|
||||||
final reverseChapter = ref.watch(sortLibraryMangaStateProvider(
|
final reverseChapter = ref.watch(sortLibraryMangaStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
return Column(
|
return Column(
|
||||||
children: [
|
children: [
|
||||||
for (var i = 0; i < 7; i++)
|
for (var i = 0; i < 7; i++)
|
||||||
|
|
@ -1349,7 +1349,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
onTap: () {
|
onTap: () {
|
||||||
ref
|
ref
|
||||||
.read(sortLibraryMangaStateProvider(
|
.read(sortLibraryMangaStateProvider(
|
||||||
isManga: widget.isManga, settings: settings)
|
itemType: widget.itemType, settings: settings)
|
||||||
.notifier)
|
.notifier)
|
||||||
.set(i);
|
.set(i);
|
||||||
},
|
},
|
||||||
|
|
@ -1360,25 +1360,25 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
}),
|
}),
|
||||||
Consumer(builder: (context, ref, chil) {
|
Consumer(builder: (context, ref, chil) {
|
||||||
final display = ref.watch(libraryDisplayTypeStateProvider(
|
final display = ref.watch(libraryDisplayTypeStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final displayV = ref.read(libraryDisplayTypeStateProvider(
|
final displayV = ref.read(libraryDisplayTypeStateProvider(
|
||||||
isManga: widget.isManga, settings: settings)
|
itemType: widget.itemType, settings: settings)
|
||||||
.notifier);
|
.notifier);
|
||||||
final showCategoryTabs = ref.watch(libraryShowCategoryTabsStateProvider(
|
final showCategoryTabs = ref.watch(libraryShowCategoryTabsStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final continueReaderBtn = ref.watch(
|
final continueReaderBtn = ref.watch(
|
||||||
libraryShowContinueReadingButtonStateProvider(
|
libraryShowContinueReadingButtonStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final showNumbersOfItems = ref.watch(
|
final showNumbersOfItems = ref.watch(
|
||||||
libraryShowNumbersOfItemsStateProvider(
|
libraryShowNumbersOfItemsStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final downloadedChapter = ref.watch(
|
final downloadedChapter = ref.watch(
|
||||||
libraryDownloadedChaptersStateProvider(
|
libraryDownloadedChaptersStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final language = ref.watch(libraryLanguageStateProvider(
|
final language = ref.watch(libraryLanguageStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
final localSource = ref.watch(libraryLocalSourceStateProvider(
|
final localSource = ref.watch(libraryLocalSourceStateProvider(
|
||||||
isManga: widget.isManga, settings: settings));
|
itemType: widget.itemType, settings: settings));
|
||||||
return SingleChildScrollView(
|
return SingleChildScrollView(
|
||||||
physics: const NeverScrollableScrollPhysics(),
|
physics: const NeverScrollableScrollPhysics(),
|
||||||
child: Column(
|
child: Column(
|
||||||
|
|
@ -1451,7 +1451,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
Consumer(
|
Consumer(
|
||||||
builder: (context, ref, child) {
|
builder: (context, ref, child) {
|
||||||
final gridSize = ref.watch(libraryGridSizeStateProvider(
|
final gridSize = ref.watch(libraryGridSizeStateProvider(
|
||||||
isManga: widget.isManga)) ??
|
itemType: widget.itemType)) ??
|
||||||
0;
|
0;
|
||||||
return Padding(
|
return Padding(
|
||||||
padding: const EdgeInsets.only(left: 8, right: 8, top: 10),
|
padding: const EdgeInsets.only(left: 8, right: 8, top: 10),
|
||||||
|
|
@ -1484,14 +1484,14 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
HapticFeedback.vibrate();
|
HapticFeedback.vibrate();
|
||||||
ref
|
ref
|
||||||
.read(libraryGridSizeStateProvider(
|
.read(libraryGridSizeStateProvider(
|
||||||
isManga: widget.isManga)
|
itemType: widget.itemType)
|
||||||
.notifier)
|
.notifier)
|
||||||
.set(value.toInt());
|
.set(value.toInt());
|
||||||
},
|
},
|
||||||
onChangeEnd: (value) {
|
onChangeEnd: (value) {
|
||||||
ref
|
ref
|
||||||
.read(libraryGridSizeStateProvider(
|
.read(libraryGridSizeStateProvider(
|
||||||
isManga: widget.isManga)
|
itemType: widget.itemType)
|
||||||
.notifier)
|
.notifier)
|
||||||
.set(value.toInt(), end: true);
|
.set(value.toInt(), end: true);
|
||||||
},
|
},
|
||||||
|
|
@ -1521,7 +1521,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
onTap: () {
|
onTap: () {
|
||||||
ref
|
ref
|
||||||
.read(libraryDownloadedChaptersStateProvider(
|
.read(libraryDownloadedChaptersStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
settings: settings)
|
settings: settings)
|
||||||
.notifier)
|
.notifier)
|
||||||
.set(!downloadedChapter);
|
.set(!downloadedChapter);
|
||||||
|
|
@ -1532,7 +1532,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
onTap: () {
|
onTap: () {
|
||||||
ref
|
ref
|
||||||
.read(libraryLanguageStateProvider(
|
.read(libraryLanguageStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
settings: settings)
|
settings: settings)
|
||||||
.notifier)
|
.notifier)
|
||||||
.set(!language);
|
.set(!language);
|
||||||
|
|
@ -1543,7 +1543,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
onTap: () {
|
onTap: () {
|
||||||
ref
|
ref
|
||||||
.read(libraryLocalSourceStateProvider(
|
.read(libraryLocalSourceStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
settings: settings)
|
settings: settings)
|
||||||
.notifier)
|
.notifier)
|
||||||
.set(!localSource);
|
.set(!localSource);
|
||||||
|
|
@ -1555,7 +1555,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
ref
|
ref
|
||||||
.read(
|
.read(
|
||||||
libraryShowContinueReadingButtonStateProvider(
|
libraryShowContinueReadingButtonStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
settings: settings)
|
settings: settings)
|
||||||
.notifier)
|
.notifier)
|
||||||
.set(!continueReaderBtn);
|
.set(!continueReaderBtn);
|
||||||
|
|
@ -1579,7 +1579,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
onTap: () {
|
onTap: () {
|
||||||
ref
|
ref
|
||||||
.read(libraryShowCategoryTabsStateProvider(
|
.read(libraryShowCategoryTabsStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
settings: settings)
|
settings: settings)
|
||||||
.notifier)
|
.notifier)
|
||||||
.set(!showCategoryTabs);
|
.set(!showCategoryTabs);
|
||||||
|
|
@ -1590,7 +1590,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
onTap: () {
|
onTap: () {
|
||||||
ref
|
ref
|
||||||
.read(libraryShowNumbersOfItemsStateProvider(
|
.read(libraryShowNumbersOfItemsStateProvider(
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
settings: settings)
|
settings: settings)
|
||||||
.notifier)
|
.notifier)
|
||||||
.set(!showNumbersOfItems);
|
.set(!showNumbersOfItems);
|
||||||
|
|
@ -1636,9 +1636,9 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
final mangaIdsList = ref.watch(mangasListStateProvider);
|
final mangaIdsList = ref.watch(mangasListStateProvider);
|
||||||
final manga = categoryId == null
|
final manga = categoryId == null
|
||||||
? ref.watch(
|
? ref.watch(
|
||||||
getAllMangaWithoutCategoriesStreamProvider(isManga: widget.isManga))
|
getAllMangaWithoutCategoriesStreamProvider(itemType: widget.itemType))
|
||||||
: ref.watch(getAllMangaStreamProvider(
|
: ref.watch(getAllMangaStreamProvider(
|
||||||
categoryId: categoryId, isManga: widget.isManga));
|
categoryId: categoryId, itemType: widget.itemType));
|
||||||
final l10n = l10nLocalizations(context)!;
|
final l10n = l10nLocalizations(context)!;
|
||||||
return PreferredSize(
|
return PreferredSize(
|
||||||
preferredSize: Size.fromHeight(AppBar().preferredSize.height),
|
preferredSize: Size.fromHeight(AppBar().preferredSize.height),
|
||||||
|
|
@ -1707,7 +1707,9 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
: Row(
|
: Row(
|
||||||
children: [
|
children: [
|
||||||
Text(
|
Text(
|
||||||
widget.isManga ? l10n.manga : l10n.anime,
|
widget.itemType == ItemType.manga ?
|
||||||
|
l10n.manga : widget.itemType == ItemType.anime ?
|
||||||
|
l10n.anime : l10n.novel,
|
||||||
style:
|
style:
|
||||||
TextStyle(color: Theme.of(context).hintColor),
|
TextStyle(color: Theme.of(context).hintColor),
|
||||||
),
|
),
|
||||||
|
|
@ -1783,7 +1785,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
value: 1, child: Text(l10n.open_random_entry)),
|
value: 1, child: Text(l10n.open_random_entry)),
|
||||||
PopupMenuItem<int>(
|
PopupMenuItem<int>(
|
||||||
value: 2, child: Text(l10n.import)),
|
value: 2, child: Text(l10n.import)),
|
||||||
if (!widget.isManga)
|
if (widget.itemType == ItemType.anime)
|
||||||
PopupMenuItem<int>(
|
PopupMenuItem<int>(
|
||||||
value: 3, child: Text(l10n.torrent_stream)),
|
value: 3, child: Text(l10n.torrent_stream)),
|
||||||
];
|
];
|
||||||
|
|
@ -1806,8 +1808,8 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
source: randomManga.source!);
|
source: randomManga.source!);
|
||||||
});
|
});
|
||||||
} else if (value == 2) {
|
} else if (value == 2) {
|
||||||
_importLocal(context, widget.isManga);
|
_importLocal(context, widget.itemType);
|
||||||
} else if (value == 3 && !widget.isManga) {
|
} else if (value == 3 && widget.itemType == ItemType.anime) {
|
||||||
addTorrent(context);
|
addTorrent(context);
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
|
@ -1816,7 +1818,7 @@ class _LibraryScreenState extends ConsumerState<LibraryScreen>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _importLocal(BuildContext context, bool isManga) {
|
void _importLocal(BuildContext context, ItemType itemType) {
|
||||||
final l10n = l10nLocalizations(context)!;
|
final l10n = l10nLocalizations(context)!;
|
||||||
bool isLoading = false;
|
bool isLoading = false;
|
||||||
showDialog(
|
showDialog(
|
||||||
|
|
@ -1850,7 +1852,7 @@ void _importLocal(BuildContext context, bool isManga) {
|
||||||
});
|
});
|
||||||
await ref.watch(
|
await ref.watch(
|
||||||
importArchivesFromFileProvider(
|
importArchivesFromFileProvider(
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
null,
|
null,
|
||||||
init: true)
|
init: true)
|
||||||
.future);
|
.future);
|
||||||
|
|
@ -1865,7 +1867,7 @@ void _importLocal(BuildContext context, bool isManga) {
|
||||||
children: [
|
children: [
|
||||||
const Icon(Icons.archive_outlined),
|
const Icon(Icons.archive_outlined),
|
||||||
Text(
|
Text(
|
||||||
"${l10n.import_files} ( ${isManga ? ".zip, .cbz" : ".mp4, .mkv, .avi, and more"} )",
|
"${l10n.import_files} ( ${itemType == ItemType.manga ? ".zip, .cbz" : ".mp4, .mkv, .avi, and more"} )",
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
color: Theme.of(context)
|
color: Theme.of(context)
|
||||||
.textTheme
|
.textTheme
|
||||||
|
|
|
||||||
|
|
@ -32,7 +32,7 @@ Future addTorrentFromUrlOrFromFile(Ref ref, Manga? mManga,
|
||||||
favorite: true,
|
favorite: true,
|
||||||
source: 'torrent',
|
source: 'torrent',
|
||||||
author: '',
|
author: '',
|
||||||
isManga: false,
|
itemType: ItemType.anime,
|
||||||
genre: [],
|
genre: [],
|
||||||
imageUrl: '',
|
imageUrl: '',
|
||||||
lang: '',
|
lang: '',
|
||||||
|
|
|
||||||
|
|
@ -8,14 +8,14 @@ part 'isar_providers.g.dart';
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
Stream<List<Manga>> getAllMangaStream(Ref ref,
|
Stream<List<Manga>> getAllMangaStream(Ref ref,
|
||||||
{required int? categoryId, required bool? isManga}) async* {
|
{required int? categoryId, required ItemType itemType}) async* {
|
||||||
yield* categoryId == null
|
yield* categoryId == null
|
||||||
? isar.mangas
|
? isar.mangas
|
||||||
.filter()
|
.filter()
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.favoriteEqualTo(true)
|
.favoriteEqualTo(true)
|
||||||
.and()
|
.and()
|
||||||
.isMangaEqualTo(isManga)
|
.itemTypeEqualTo(itemType)
|
||||||
.watch(fireImmediately: true)
|
.watch(fireImmediately: true)
|
||||||
: isar.mangas
|
: isar.mangas
|
||||||
.filter()
|
.filter()
|
||||||
|
|
@ -24,26 +24,26 @@ Stream<List<Manga>> getAllMangaStream(Ref ref,
|
||||||
.categoriesIsNotEmpty()
|
.categoriesIsNotEmpty()
|
||||||
.categoriesElementEqualTo(categoryId)
|
.categoriesElementEqualTo(categoryId)
|
||||||
.and()
|
.and()
|
||||||
.isMangaEqualTo(isManga)
|
.itemTypeEqualTo(itemType)
|
||||||
.watch(fireImmediately: true);
|
.watch(fireImmediately: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
Stream<List<Manga>> getAllMangaWithoutCategoriesStream(Ref ref,
|
Stream<List<Manga>> getAllMangaWithoutCategoriesStream(Ref ref,
|
||||||
{required bool? isManga}) async* {
|
{required ItemType itemType}) async* {
|
||||||
yield* isar.mangas
|
yield* isar.mangas
|
||||||
.filter()
|
.filter()
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.favoriteEqualTo(true)
|
.favoriteEqualTo(true)
|
||||||
.categoriesIsEmpty()
|
.categoriesIsEmpty()
|
||||||
.and()
|
.and()
|
||||||
.isMangaEqualTo(isManga)
|
.itemTypeEqualTo(itemType)
|
||||||
.or()
|
.or()
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.categoriesIsNull()
|
.categoriesIsNull()
|
||||||
.favoriteEqualTo(true)
|
.favoriteEqualTo(true)
|
||||||
.and()
|
.and()
|
||||||
.isMangaEqualTo(isManga)
|
.itemTypeEqualTo(itemType)
|
||||||
.watch(fireImmediately: true);
|
.watch(fireImmediately: true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -41,11 +41,11 @@ class GetAllMangaStreamFamily extends Family<AsyncValue<List<Manga>>> {
|
||||||
/// See also [getAllMangaStream].
|
/// See also [getAllMangaStream].
|
||||||
GetAllMangaStreamProvider call({
|
GetAllMangaStreamProvider call({
|
||||||
required int? categoryId,
|
required int? categoryId,
|
||||||
required bool? isManga,
|
required ItemType itemType,
|
||||||
}) {
|
}) {
|
||||||
return GetAllMangaStreamProvider(
|
return GetAllMangaStreamProvider(
|
||||||
categoryId: categoryId,
|
categoryId: categoryId,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -55,7 +55,7 @@ class GetAllMangaStreamFamily extends Family<AsyncValue<List<Manga>>> {
|
||||||
) {
|
) {
|
||||||
return call(
|
return call(
|
||||||
categoryId: provider.categoryId,
|
categoryId: provider.categoryId,
|
||||||
isManga: provider.isManga,
|
itemType: provider.itemType,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -79,12 +79,12 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider<List<Manga>> {
|
||||||
/// See also [getAllMangaStream].
|
/// See also [getAllMangaStream].
|
||||||
GetAllMangaStreamProvider({
|
GetAllMangaStreamProvider({
|
||||||
required int? categoryId,
|
required int? categoryId,
|
||||||
required bool? isManga,
|
required ItemType itemType,
|
||||||
}) : this._internal(
|
}) : this._internal(
|
||||||
(ref) => getAllMangaStream(
|
(ref) => getAllMangaStream(
|
||||||
ref as GetAllMangaStreamRef,
|
ref as GetAllMangaStreamRef,
|
||||||
categoryId: categoryId,
|
categoryId: categoryId,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
),
|
),
|
||||||
from: getAllMangaStreamProvider,
|
from: getAllMangaStreamProvider,
|
||||||
name: r'getAllMangaStreamProvider',
|
name: r'getAllMangaStreamProvider',
|
||||||
|
|
@ -96,7 +96,7 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider<List<Manga>> {
|
||||||
allTransitiveDependencies:
|
allTransitiveDependencies:
|
||||||
GetAllMangaStreamFamily._allTransitiveDependencies,
|
GetAllMangaStreamFamily._allTransitiveDependencies,
|
||||||
categoryId: categoryId,
|
categoryId: categoryId,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
);
|
);
|
||||||
|
|
||||||
GetAllMangaStreamProvider._internal(
|
GetAllMangaStreamProvider._internal(
|
||||||
|
|
@ -107,11 +107,11 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider<List<Manga>> {
|
||||||
required super.debugGetCreateSourceHash,
|
required super.debugGetCreateSourceHash,
|
||||||
required super.from,
|
required super.from,
|
||||||
required this.categoryId,
|
required this.categoryId,
|
||||||
required this.isManga,
|
required this.itemType,
|
||||||
}) : super.internal();
|
}) : super.internal();
|
||||||
|
|
||||||
final int? categoryId;
|
final int? categoryId;
|
||||||
final bool? isManga;
|
final ItemType itemType;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Override overrideWith(
|
Override overrideWith(
|
||||||
|
|
@ -127,7 +127,7 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider<List<Manga>> {
|
||||||
allTransitiveDependencies: null,
|
allTransitiveDependencies: null,
|
||||||
debugGetCreateSourceHash: null,
|
debugGetCreateSourceHash: null,
|
||||||
categoryId: categoryId,
|
categoryId: categoryId,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -141,14 +141,14 @@ class GetAllMangaStreamProvider extends AutoDisposeStreamProvider<List<Manga>> {
|
||||||
bool operator ==(Object other) {
|
bool operator ==(Object other) {
|
||||||
return other is GetAllMangaStreamProvider &&
|
return other is GetAllMangaStreamProvider &&
|
||||||
other.categoryId == categoryId &&
|
other.categoryId == categoryId &&
|
||||||
other.isManga == isManga;
|
other.itemType == itemType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode {
|
int get hashCode {
|
||||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||||
hash = _SystemHash.combine(hash, categoryId.hashCode);
|
hash = _SystemHash.combine(hash, categoryId.hashCode);
|
||||||
hash = _SystemHash.combine(hash, isManga.hashCode);
|
hash = _SystemHash.combine(hash, itemType.hashCode);
|
||||||
|
|
||||||
return _SystemHash.finish(hash);
|
return _SystemHash.finish(hash);
|
||||||
}
|
}
|
||||||
|
|
@ -160,8 +160,8 @@ mixin GetAllMangaStreamRef on AutoDisposeStreamProviderRef<List<Manga>> {
|
||||||
/// The parameter `categoryId` of this provider.
|
/// The parameter `categoryId` of this provider.
|
||||||
int? get categoryId;
|
int? get categoryId;
|
||||||
|
|
||||||
/// The parameter `isManga` of this provider.
|
/// The parameter `itemType` of this provider.
|
||||||
bool? get isManga;
|
ItemType get itemType;
|
||||||
}
|
}
|
||||||
|
|
||||||
class _GetAllMangaStreamProviderElement
|
class _GetAllMangaStreamProviderElement
|
||||||
|
|
@ -172,7 +172,7 @@ class _GetAllMangaStreamProviderElement
|
||||||
@override
|
@override
|
||||||
int? get categoryId => (origin as GetAllMangaStreamProvider).categoryId;
|
int? get categoryId => (origin as GetAllMangaStreamProvider).categoryId;
|
||||||
@override
|
@override
|
||||||
bool? get isManga => (origin as GetAllMangaStreamProvider).isManga;
|
ItemType get itemType => (origin as GetAllMangaStreamProvider).itemType;
|
||||||
}
|
}
|
||||||
|
|
||||||
String _$getAllMangaWithoutCategoriesStreamHash() =>
|
String _$getAllMangaWithoutCategoriesStreamHash() =>
|
||||||
|
|
@ -191,10 +191,10 @@ class GetAllMangaWithoutCategoriesStreamFamily
|
||||||
|
|
||||||
/// See also [getAllMangaWithoutCategoriesStream].
|
/// See also [getAllMangaWithoutCategoriesStream].
|
||||||
GetAllMangaWithoutCategoriesStreamProvider call({
|
GetAllMangaWithoutCategoriesStreamProvider call({
|
||||||
required bool? isManga,
|
required ItemType itemType,
|
||||||
}) {
|
}) {
|
||||||
return GetAllMangaWithoutCategoriesStreamProvider(
|
return GetAllMangaWithoutCategoriesStreamProvider(
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -203,7 +203,7 @@ class GetAllMangaWithoutCategoriesStreamFamily
|
||||||
covariant GetAllMangaWithoutCategoriesStreamProvider provider,
|
covariant GetAllMangaWithoutCategoriesStreamProvider provider,
|
||||||
) {
|
) {
|
||||||
return call(
|
return call(
|
||||||
isManga: provider.isManga,
|
itemType: provider.itemType,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -227,11 +227,11 @@ class GetAllMangaWithoutCategoriesStreamProvider
|
||||||
extends AutoDisposeStreamProvider<List<Manga>> {
|
extends AutoDisposeStreamProvider<List<Manga>> {
|
||||||
/// See also [getAllMangaWithoutCategoriesStream].
|
/// See also [getAllMangaWithoutCategoriesStream].
|
||||||
GetAllMangaWithoutCategoriesStreamProvider({
|
GetAllMangaWithoutCategoriesStreamProvider({
|
||||||
required bool? isManga,
|
required ItemType itemType,
|
||||||
}) : this._internal(
|
}) : this._internal(
|
||||||
(ref) => getAllMangaWithoutCategoriesStream(
|
(ref) => getAllMangaWithoutCategoriesStream(
|
||||||
ref as GetAllMangaWithoutCategoriesStreamRef,
|
ref as GetAllMangaWithoutCategoriesStreamRef,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
),
|
),
|
||||||
from: getAllMangaWithoutCategoriesStreamProvider,
|
from: getAllMangaWithoutCategoriesStreamProvider,
|
||||||
name: r'getAllMangaWithoutCategoriesStreamProvider',
|
name: r'getAllMangaWithoutCategoriesStreamProvider',
|
||||||
|
|
@ -242,7 +242,7 @@ class GetAllMangaWithoutCategoriesStreamProvider
|
||||||
dependencies: GetAllMangaWithoutCategoriesStreamFamily._dependencies,
|
dependencies: GetAllMangaWithoutCategoriesStreamFamily._dependencies,
|
||||||
allTransitiveDependencies: GetAllMangaWithoutCategoriesStreamFamily
|
allTransitiveDependencies: GetAllMangaWithoutCategoriesStreamFamily
|
||||||
._allTransitiveDependencies,
|
._allTransitiveDependencies,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
);
|
);
|
||||||
|
|
||||||
GetAllMangaWithoutCategoriesStreamProvider._internal(
|
GetAllMangaWithoutCategoriesStreamProvider._internal(
|
||||||
|
|
@ -252,10 +252,10 @@ class GetAllMangaWithoutCategoriesStreamProvider
|
||||||
required super.allTransitiveDependencies,
|
required super.allTransitiveDependencies,
|
||||||
required super.debugGetCreateSourceHash,
|
required super.debugGetCreateSourceHash,
|
||||||
required super.from,
|
required super.from,
|
||||||
required this.isManga,
|
required this.itemType,
|
||||||
}) : super.internal();
|
}) : super.internal();
|
||||||
|
|
||||||
final bool? isManga;
|
final ItemType itemType;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Override overrideWith(
|
Override overrideWith(
|
||||||
|
|
@ -271,7 +271,7 @@ class GetAllMangaWithoutCategoriesStreamProvider
|
||||||
dependencies: null,
|
dependencies: null,
|
||||||
allTransitiveDependencies: null,
|
allTransitiveDependencies: null,
|
||||||
debugGetCreateSourceHash: null,
|
debugGetCreateSourceHash: null,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -284,13 +284,13 @@ class GetAllMangaWithoutCategoriesStreamProvider
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) {
|
bool operator ==(Object other) {
|
||||||
return other is GetAllMangaWithoutCategoriesStreamProvider &&
|
return other is GetAllMangaWithoutCategoriesStreamProvider &&
|
||||||
other.isManga == isManga;
|
other.itemType == itemType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode {
|
int get hashCode {
|
||||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||||
hash = _SystemHash.combine(hash, isManga.hashCode);
|
hash = _SystemHash.combine(hash, itemType.hashCode);
|
||||||
|
|
||||||
return _SystemHash.finish(hash);
|
return _SystemHash.finish(hash);
|
||||||
}
|
}
|
||||||
|
|
@ -300,8 +300,8 @@ class GetAllMangaWithoutCategoriesStreamProvider
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
mixin GetAllMangaWithoutCategoriesStreamRef
|
mixin GetAllMangaWithoutCategoriesStreamRef
|
||||||
on AutoDisposeStreamProviderRef<List<Manga>> {
|
on AutoDisposeStreamProviderRef<List<Manga>> {
|
||||||
/// The parameter `isManga` of this provider.
|
/// The parameter `itemType` of this provider.
|
||||||
bool? get isManga;
|
ItemType get itemType;
|
||||||
}
|
}
|
||||||
|
|
||||||
class _GetAllMangaWithoutCategoriesStreamProviderElement
|
class _GetAllMangaWithoutCategoriesStreamProviderElement
|
||||||
|
|
@ -310,8 +310,8 @@ class _GetAllMangaWithoutCategoriesStreamProviderElement
|
||||||
_GetAllMangaWithoutCategoriesStreamProviderElement(super.provider);
|
_GetAllMangaWithoutCategoriesStreamProviderElement(super.provider);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool? get isManga =>
|
ItemType get itemType =>
|
||||||
(origin as GetAllMangaWithoutCategoriesStreamProvider).isManga;
|
(origin as GetAllMangaWithoutCategoriesStreamProvider).itemType;
|
||||||
}
|
}
|
||||||
|
|
||||||
String _$getSettingsStreamHash() => r'c5a51e0e3473b25d2365025832a27ed2cc029b27';
|
String _$getSettingsStreamHash() => r'c5a51e0e3473b25d2365025832a27ed2cc029b27';
|
||||||
|
|
|
||||||
|
|
@ -12,8 +12,15 @@ part 'library_state_provider.g.dart';
|
||||||
@riverpod
|
@riverpod
|
||||||
class LibraryDisplayTypeState extends _$LibraryDisplayTypeState {
|
class LibraryDisplayTypeState extends _$LibraryDisplayTypeState {
|
||||||
@override
|
@override
|
||||||
DisplayType build({required bool isManga, required Settings settings}) {
|
DisplayType build({required ItemType itemType, required Settings settings}) {
|
||||||
return isManga ? settings.displayType : settings.animeDisplayType;
|
switch (itemType) {
|
||||||
|
case ItemType.manga:
|
||||||
|
return settings.displayType;
|
||||||
|
case ItemType.anime:
|
||||||
|
return settings.animeDisplayType;
|
||||||
|
default:
|
||||||
|
return settings.novelDisplayType;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String getLibraryDisplayTypeName(
|
String getLibraryDisplayTypeName(
|
||||||
|
|
@ -31,10 +38,16 @@ class LibraryDisplayTypeState extends _$LibraryDisplayTypeState {
|
||||||
Settings appSettings = Settings();
|
Settings appSettings = Settings();
|
||||||
|
|
||||||
state = displayType;
|
state = displayType;
|
||||||
if (isManga) {
|
|
||||||
appSettings = settings..displayType = displayType;
|
switch (itemType) {
|
||||||
} else {
|
case ItemType.manga:
|
||||||
appSettings = settings..animeDisplayType = displayType;
|
appSettings = settings..displayType = displayType;
|
||||||
|
break;
|
||||||
|
case ItemType.anime:
|
||||||
|
appSettings = settings..animeDisplayType = displayType;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appSettings = settings..novelDisplayType = displayType;
|
||||||
}
|
}
|
||||||
|
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
|
|
@ -46,8 +59,15 @@ class LibraryDisplayTypeState extends _$LibraryDisplayTypeState {
|
||||||
@riverpod
|
@riverpod
|
||||||
class LibraryGridSizeState extends _$LibraryGridSizeState {
|
class LibraryGridSizeState extends _$LibraryGridSizeState {
|
||||||
@override
|
@override
|
||||||
int? build({required bool isManga}) {
|
int? build({required ItemType itemType}) {
|
||||||
return isManga ? settings.mangaGridSize : settings.animeGridSize;
|
switch (itemType) {
|
||||||
|
case ItemType.manga:
|
||||||
|
return settings.mangaGridSize;
|
||||||
|
case ItemType.anime:
|
||||||
|
return settings.animeGridSize;
|
||||||
|
default:
|
||||||
|
return settings.novelGridSize;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Settings get settings {
|
Settings get settings {
|
||||||
|
|
@ -59,10 +79,15 @@ class LibraryGridSizeState extends _$LibraryGridSizeState {
|
||||||
|
|
||||||
state = value;
|
state = value;
|
||||||
if (end) {
|
if (end) {
|
||||||
if (isManga) {
|
switch (itemType) {
|
||||||
appSettings = settings..mangaGridSize = value;
|
case ItemType.manga:
|
||||||
} else {
|
appSettings = settings..mangaGridSize = value;
|
||||||
appSettings = settings..animeGridSize = value;
|
break;
|
||||||
|
case ItemType.anime:
|
||||||
|
appSettings = settings..animeGridSize = value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appSettings = settings..novelGridSize = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
|
|
@ -77,24 +102,34 @@ class MangaFilterDownloadedState extends _$MangaFilterDownloadedState {
|
||||||
@override
|
@override
|
||||||
int build(
|
int build(
|
||||||
{required List<Manga> mangaList,
|
{required List<Manga> mangaList,
|
||||||
required bool isManga,
|
required ItemType itemType,
|
||||||
required Settings settings}) {
|
required Settings settings}) {
|
||||||
state = getType();
|
state = getType();
|
||||||
return getType();
|
return getType();
|
||||||
}
|
}
|
||||||
|
|
||||||
int getType() {
|
int getType() {
|
||||||
return isManga
|
switch (itemType) {
|
||||||
? settings.libraryFilterMangasDownloadType!
|
case ItemType.manga:
|
||||||
: settings.libraryFilterAnimeDownloadType ?? 0;
|
return settings.libraryFilterMangasDownloadType!;
|
||||||
|
case ItemType.anime:
|
||||||
|
return settings.libraryFilterAnimeDownloadType!;
|
||||||
|
default:
|
||||||
|
return settings.libraryFilterNovelDownloadType ?? 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setType(int type) {
|
void setType(int type) {
|
||||||
Settings appSettings = Settings();
|
Settings appSettings = Settings();
|
||||||
if (isManga) {
|
switch (itemType) {
|
||||||
appSettings = settings..libraryFilterMangasDownloadType = type;
|
case ItemType.manga:
|
||||||
} else {
|
appSettings = settings..libraryFilterMangasDownloadType = type;
|
||||||
appSettings = settings..libraryFilterAnimeDownloadType = type;
|
break;
|
||||||
|
case ItemType.anime:
|
||||||
|
appSettings = settings..libraryFilterAnimeDownloadType = type;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appSettings = settings..libraryFilterNovelDownloadType = type;
|
||||||
}
|
}
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
isar.settings.putSync(appSettings);
|
isar.settings.putSync(appSettings);
|
||||||
|
|
@ -118,24 +153,34 @@ class MangaFilterUnreadState extends _$MangaFilterUnreadState {
|
||||||
@override
|
@override
|
||||||
int build(
|
int build(
|
||||||
{required List<Manga> mangaList,
|
{required List<Manga> mangaList,
|
||||||
required bool isManga,
|
required ItemType itemType,
|
||||||
required Settings settings}) {
|
required Settings settings}) {
|
||||||
state = getType();
|
state = getType();
|
||||||
return getType();
|
return getType();
|
||||||
}
|
}
|
||||||
|
|
||||||
int getType() {
|
int getType() {
|
||||||
return isManga
|
switch (itemType) {
|
||||||
? settings.libraryFilterMangasUnreadType!
|
case ItemType.manga:
|
||||||
: settings.libraryFilterAnimeUnreadType ?? 0;
|
return settings.libraryFilterMangasUnreadType!;
|
||||||
|
case ItemType.anime:
|
||||||
|
return settings.libraryFilterAnimeUnreadType!;
|
||||||
|
default:
|
||||||
|
return settings.libraryFilterNovelUnreadType ?? 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setType(int type) {
|
void setType(int type) {
|
||||||
Settings appSettings = Settings();
|
Settings appSettings = Settings();
|
||||||
if (isManga) {
|
switch (itemType) {
|
||||||
appSettings = settings..libraryFilterMangasUnreadType = type;
|
case ItemType.manga:
|
||||||
} else {
|
appSettings = settings..libraryFilterMangasUnreadType = type;
|
||||||
appSettings = settings..libraryFilterAnimeUnreadType = type;
|
break;
|
||||||
|
case ItemType.anime:
|
||||||
|
appSettings = settings..libraryFilterAnimeUnreadType = type;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appSettings = settings..libraryFilterNovelUnreadType = type;
|
||||||
}
|
}
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
isar.settings.putSync(appSettings);
|
isar.settings.putSync(appSettings);
|
||||||
|
|
@ -208,24 +253,34 @@ class MangaFilterStartedState extends _$MangaFilterStartedState {
|
||||||
@override
|
@override
|
||||||
int build(
|
int build(
|
||||||
{required List<Manga> mangaList,
|
{required List<Manga> mangaList,
|
||||||
required bool isManga,
|
required ItemType itemType,
|
||||||
required Settings settings}) {
|
required Settings settings}) {
|
||||||
state = getType();
|
state = getType();
|
||||||
return getType();
|
return getType();
|
||||||
}
|
}
|
||||||
|
|
||||||
int getType() {
|
int getType() {
|
||||||
return isManga
|
switch (itemType) {
|
||||||
? settings.libraryFilterMangasStartedType!
|
case ItemType.manga:
|
||||||
: settings.libraryFilterAnimeStartedType ?? 0;
|
return settings.libraryFilterMangasStartedType!;
|
||||||
|
case ItemType.anime:
|
||||||
|
return settings.libraryFilterAnimeStartedType!;
|
||||||
|
default:
|
||||||
|
return settings.libraryFilterNovelStartedType ?? 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setType(int type) {
|
void setType(int type) {
|
||||||
Settings appSettings = Settings();
|
Settings appSettings = Settings();
|
||||||
if (isManga) {
|
switch (itemType) {
|
||||||
appSettings = settings..libraryFilterMangasStartedType = type;
|
case ItemType.manga:
|
||||||
} else {
|
appSettings = settings..libraryFilterMangasStartedType = type;
|
||||||
appSettings = settings..libraryFilterAnimeStartedType = type;
|
break;
|
||||||
|
case ItemType.anime:
|
||||||
|
appSettings = settings..libraryFilterAnimeStartedType = type;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appSettings = settings..libraryFilterNovelStartedType = type;
|
||||||
}
|
}
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
isar.settings.putSync(appSettings);
|
isar.settings.putSync(appSettings);
|
||||||
|
|
@ -298,24 +353,34 @@ class MangaFilterBookmarkedState extends _$MangaFilterBookmarkedState {
|
||||||
@override
|
@override
|
||||||
int build(
|
int build(
|
||||||
{required List<Manga> mangaList,
|
{required List<Manga> mangaList,
|
||||||
required bool isManga,
|
required ItemType itemType,
|
||||||
required Settings settings}) {
|
required Settings settings}) {
|
||||||
state = getType();
|
state = getType();
|
||||||
return getType();
|
return getType();
|
||||||
}
|
}
|
||||||
|
|
||||||
int getType() {
|
int getType() {
|
||||||
return isManga
|
switch (itemType) {
|
||||||
? settings.libraryFilterMangasBookMarkedType!
|
case ItemType.manga:
|
||||||
: settings.libraryFilterAnimeBookMarkedType ?? 0;
|
return settings.libraryFilterMangasBookMarkedType!;
|
||||||
|
case ItemType.anime:
|
||||||
|
return settings.libraryFilterAnimeBookMarkedType!;
|
||||||
|
default:
|
||||||
|
return settings.libraryFilterNovelBookMarkedType ?? 0;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void setType(int type) {
|
void setType(int type) {
|
||||||
Settings appSettings = Settings();
|
Settings appSettings = Settings();
|
||||||
if (isManga) {
|
switch (itemType) {
|
||||||
appSettings = settings..libraryFilterMangasBookMarkedType = type;
|
case ItemType.manga:
|
||||||
} else {
|
appSettings = settings..libraryFilterMangasBookMarkedType = type;
|
||||||
appSettings = settings..libraryFilterAnimeBookMarkedType = type;
|
break;
|
||||||
|
case ItemType.anime:
|
||||||
|
appSettings = settings..libraryFilterAnimeBookMarkedType = type;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appSettings = settings..libraryFilterNovelBookMarkedType = type;
|
||||||
}
|
}
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
isar.settings.putSync(appSettings);
|
isar.settings.putSync(appSettings);
|
||||||
|
|
@ -388,16 +453,16 @@ class MangasFilterResultState extends _$MangasFilterResultState {
|
||||||
@override
|
@override
|
||||||
bool build(
|
bool build(
|
||||||
{required List<Manga> mangaList,
|
{required List<Manga> mangaList,
|
||||||
required bool isManga,
|
required ItemType itemType,
|
||||||
required Settings settings}) {
|
required Settings settings}) {
|
||||||
final downloadFilterType = ref.watch(mangaFilterDownloadedStateProvider(
|
final downloadFilterType = ref.watch(mangaFilterDownloadedStateProvider(
|
||||||
mangaList: mangaList, isManga: isManga, settings: settings));
|
mangaList: mangaList, itemType: itemType, settings: settings));
|
||||||
final unreadFilterType = ref.watch(mangaFilterUnreadStateProvider(
|
final unreadFilterType = ref.watch(mangaFilterUnreadStateProvider(
|
||||||
mangaList: mangaList, isManga: isManga, settings: settings));
|
mangaList: mangaList, itemType: itemType, settings: settings));
|
||||||
final startedFilterType = ref.watch(mangaFilterStartedStateProvider(
|
final startedFilterType = ref.watch(mangaFilterStartedStateProvider(
|
||||||
mangaList: mangaList, isManga: isManga, settings: settings));
|
mangaList: mangaList, itemType: itemType, settings: settings));
|
||||||
final bookmarkedFilterType = ref.watch(mangaFilterBookmarkedStateProvider(
|
final bookmarkedFilterType = ref.watch(mangaFilterBookmarkedStateProvider(
|
||||||
mangaList: mangaList, isManga: isManga, settings: settings));
|
mangaList: mangaList, itemType: itemType, settings: settings));
|
||||||
return downloadFilterType == 0 &&
|
return downloadFilterType == 0 &&
|
||||||
unreadFilterType == 0 &&
|
unreadFilterType == 0 &&
|
||||||
startedFilterType == 0 &&
|
startedFilterType == 0 &&
|
||||||
|
|
@ -408,18 +473,28 @@ class MangasFilterResultState extends _$MangasFilterResultState {
|
||||||
@riverpod
|
@riverpod
|
||||||
class LibraryShowCategoryTabsState extends _$LibraryShowCategoryTabsState {
|
class LibraryShowCategoryTabsState extends _$LibraryShowCategoryTabsState {
|
||||||
@override
|
@override
|
||||||
bool build({required bool isManga, required Settings settings}) {
|
bool build({required ItemType itemType, required Settings settings}) {
|
||||||
return isManga
|
switch (itemType) {
|
||||||
? settings.libraryShowCategoryTabs!
|
case ItemType.manga:
|
||||||
: settings.animeLibraryShowCategoryTabs ?? false;
|
return settings.libraryShowCategoryTabs!;
|
||||||
|
case ItemType.anime:
|
||||||
|
return settings.animeLibraryShowCategoryTabs!;
|
||||||
|
default:
|
||||||
|
return settings.novelLibraryShowCategoryTabs ?? false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set(bool value) {
|
void set(bool value) {
|
||||||
Settings appSettings = Settings();
|
Settings appSettings = Settings();
|
||||||
if (isManga) {
|
switch (itemType) {
|
||||||
appSettings = settings..libraryShowCategoryTabs = value;
|
case ItemType.manga:
|
||||||
} else {
|
appSettings = settings..libraryShowCategoryTabs = value;
|
||||||
appSettings = settings..animeLibraryShowCategoryTabs = value;
|
break;
|
||||||
|
case ItemType.anime:
|
||||||
|
appSettings = settings..animeLibraryShowCategoryTabs = value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appSettings = settings..novelLibraryShowCategoryTabs = value;
|
||||||
}
|
}
|
||||||
state = value;
|
state = value;
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
|
|
@ -431,18 +506,28 @@ class LibraryShowCategoryTabsState extends _$LibraryShowCategoryTabsState {
|
||||||
@riverpod
|
@riverpod
|
||||||
class LibraryDownloadedChaptersState extends _$LibraryDownloadedChaptersState {
|
class LibraryDownloadedChaptersState extends _$LibraryDownloadedChaptersState {
|
||||||
@override
|
@override
|
||||||
bool build({required bool isManga, required Settings settings}) {
|
bool build({required ItemType itemType, required Settings settings}) {
|
||||||
return isManga
|
switch (itemType) {
|
||||||
? settings.libraryDownloadedChapters!
|
case ItemType.manga:
|
||||||
: settings.animeLibraryDownloadedChapters ?? false;
|
return settings.libraryDownloadedChapters!;
|
||||||
|
case ItemType.anime:
|
||||||
|
return settings.animeLibraryDownloadedChapters!;
|
||||||
|
default:
|
||||||
|
return settings.novelLibraryDownloadedChapters ?? false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set(bool value) {
|
void set(bool value) {
|
||||||
Settings appSettings = Settings();
|
Settings appSettings = Settings();
|
||||||
if (isManga) {
|
switch (itemType) {
|
||||||
appSettings = settings..libraryDownloadedChapters = value;
|
case ItemType.manga:
|
||||||
} else {
|
appSettings = settings..libraryDownloadedChapters = value;
|
||||||
appSettings = settings..animeLibraryDownloadedChapters = value;
|
break;
|
||||||
|
case ItemType.anime:
|
||||||
|
appSettings = settings..animeLibraryDownloadedChapters = value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appSettings = settings..novelLibraryDownloadedChapters = value;
|
||||||
}
|
}
|
||||||
state = value;
|
state = value;
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
|
|
@ -454,18 +539,28 @@ class LibraryDownloadedChaptersState extends _$LibraryDownloadedChaptersState {
|
||||||
@riverpod
|
@riverpod
|
||||||
class LibraryLanguageState extends _$LibraryLanguageState {
|
class LibraryLanguageState extends _$LibraryLanguageState {
|
||||||
@override
|
@override
|
||||||
bool build({required bool isManga, required Settings settings}) {
|
bool build({required ItemType itemType, required Settings settings}) {
|
||||||
return isManga
|
switch (itemType) {
|
||||||
? settings.libraryShowLanguage!
|
case ItemType.manga:
|
||||||
: settings.animeLibraryShowLanguage ?? false;
|
return settings.libraryShowLanguage!;
|
||||||
|
case ItemType.anime:
|
||||||
|
return settings.animeLibraryShowLanguage!;
|
||||||
|
default:
|
||||||
|
return settings.novelLibraryShowLanguage ?? false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set(bool value) {
|
void set(bool value) {
|
||||||
Settings appSettings = Settings();
|
Settings appSettings = Settings();
|
||||||
if (isManga) {
|
switch (itemType) {
|
||||||
appSettings = settings..libraryShowLanguage = value;
|
case ItemType.manga:
|
||||||
} else {
|
appSettings = settings..libraryShowLanguage = value;
|
||||||
appSettings = settings..animeLibraryShowLanguage = value;
|
break;
|
||||||
|
case ItemType.anime:
|
||||||
|
appSettings = settings..animeLibraryShowLanguage = value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appSettings = settings..novelLibraryShowLanguage = value;
|
||||||
}
|
}
|
||||||
state = value;
|
state = value;
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
|
|
@ -477,18 +572,28 @@ class LibraryLanguageState extends _$LibraryLanguageState {
|
||||||
@riverpod
|
@riverpod
|
||||||
class LibraryLocalSourceState extends _$LibraryLocalSourceState {
|
class LibraryLocalSourceState extends _$LibraryLocalSourceState {
|
||||||
@override
|
@override
|
||||||
bool build({required bool isManga, required Settings settings}) {
|
bool build({required ItemType itemType, required Settings settings}) {
|
||||||
return isManga
|
switch (itemType) {
|
||||||
? settings.libraryLocalSource ?? false
|
case ItemType.manga:
|
||||||
: settings.animeLibraryLocalSource ?? false;
|
return settings.libraryLocalSource!;
|
||||||
|
case ItemType.anime:
|
||||||
|
return settings.animeLibraryLocalSource!;
|
||||||
|
default:
|
||||||
|
return settings.novelLibraryLocalSource ?? false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set(bool value) {
|
void set(bool value) {
|
||||||
Settings appSettings = Settings();
|
Settings appSettings = Settings();
|
||||||
if (isManga) {
|
switch (itemType) {
|
||||||
appSettings = settings..libraryLocalSource = value;
|
case ItemType.manga:
|
||||||
} else {
|
appSettings = settings..libraryLocalSource = value;
|
||||||
appSettings = settings..animeLibraryLocalSource = value;
|
break;
|
||||||
|
case ItemType.anime:
|
||||||
|
appSettings = settings..animeLibraryLocalSource = value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appSettings = settings..novelLibraryLocalSource = value;
|
||||||
}
|
}
|
||||||
state = value;
|
state = value;
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
|
|
@ -500,18 +605,28 @@ class LibraryLocalSourceState extends _$LibraryLocalSourceState {
|
||||||
@riverpod
|
@riverpod
|
||||||
class LibraryShowNumbersOfItemsState extends _$LibraryShowNumbersOfItemsState {
|
class LibraryShowNumbersOfItemsState extends _$LibraryShowNumbersOfItemsState {
|
||||||
@override
|
@override
|
||||||
bool build({required bool isManga, required Settings settings}) {
|
bool build({required ItemType itemType, required Settings settings}) {
|
||||||
return isManga
|
switch (itemType) {
|
||||||
? settings.libraryShowNumbersOfItems!
|
case ItemType.manga:
|
||||||
: settings.animeLibraryShowNumbersOfItems ?? false;
|
return settings.libraryShowNumbersOfItems!;
|
||||||
|
case ItemType.anime:
|
||||||
|
return settings.animeLibraryShowNumbersOfItems!;
|
||||||
|
default:
|
||||||
|
return settings.novelLibraryShowNumbersOfItems ?? false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set(bool value) {
|
void set(bool value) {
|
||||||
Settings appSettings = Settings();
|
Settings appSettings = Settings();
|
||||||
if (isManga) {
|
switch (itemType) {
|
||||||
appSettings = settings..libraryShowNumbersOfItems = value;
|
case ItemType.manga:
|
||||||
} else {
|
appSettings = settings..libraryShowNumbersOfItems = value;
|
||||||
appSettings = settings..animeLibraryShowNumbersOfItems = value;
|
break;
|
||||||
|
case ItemType.anime:
|
||||||
|
appSettings = settings..animeLibraryShowNumbersOfItems = value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appSettings = settings..novelLibraryShowNumbersOfItems = value;
|
||||||
}
|
}
|
||||||
state = value;
|
state = value;
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
|
|
@ -524,18 +639,28 @@ class LibraryShowNumbersOfItemsState extends _$LibraryShowNumbersOfItemsState {
|
||||||
class LibraryShowContinueReadingButtonState
|
class LibraryShowContinueReadingButtonState
|
||||||
extends _$LibraryShowContinueReadingButtonState {
|
extends _$LibraryShowContinueReadingButtonState {
|
||||||
@override
|
@override
|
||||||
bool build({required bool isManga, required Settings settings}) {
|
bool build({required ItemType itemType, required Settings settings}) {
|
||||||
return isManga
|
switch (itemType) {
|
||||||
? settings.libraryShowContinueReadingButton!
|
case ItemType.manga:
|
||||||
: settings.animeLibraryShowContinueReadingButton ?? false;
|
return settings.libraryShowContinueReadingButton!;
|
||||||
|
case ItemType.anime:
|
||||||
|
return settings.animeLibraryShowContinueReadingButton!;
|
||||||
|
default:
|
||||||
|
return settings.novelLibraryShowContinueReadingButton ?? false;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void set(bool value) {
|
void set(bool value) {
|
||||||
Settings appSettings = Settings();
|
Settings appSettings = Settings();
|
||||||
if (isManga) {
|
switch (itemType) {
|
||||||
appSettings = settings..libraryShowContinueReadingButton = value;
|
case ItemType.manga:
|
||||||
} else {
|
appSettings = settings..libraryShowContinueReadingButton = value;
|
||||||
appSettings = settings..animeLibraryShowContinueReadingButton = value;
|
break;
|
||||||
|
case ItemType.anime:
|
||||||
|
appSettings = settings..animeLibraryShowContinueReadingButton = value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appSettings = settings..novelLibraryShowContinueReadingButton = value;
|
||||||
}
|
}
|
||||||
state = value;
|
state = value;
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
|
|
@ -547,10 +672,15 @@ class LibraryShowContinueReadingButtonState
|
||||||
@riverpod
|
@riverpod
|
||||||
class SortLibraryMangaState extends _$SortLibraryMangaState {
|
class SortLibraryMangaState extends _$SortLibraryMangaState {
|
||||||
@override
|
@override
|
||||||
SortLibraryManga build({required bool isManga, required Settings settings}) {
|
SortLibraryManga build({required ItemType itemType, required Settings settings}) {
|
||||||
return isManga
|
switch (itemType) {
|
||||||
? settings.sortLibraryManga ?? SortLibraryManga()
|
case ItemType.manga:
|
||||||
: settings.sortLibraryAnime ?? SortLibraryManga();
|
return settings.sortLibraryManga ?? SortLibraryManga();
|
||||||
|
case ItemType.anime:
|
||||||
|
return settings.sortLibraryAnime ?? SortLibraryManga();
|
||||||
|
default:
|
||||||
|
return settings.sortLibraryNovel ?? SortLibraryManga();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void update(bool reverse, int index) {
|
void update(bool reverse, int index) {
|
||||||
|
|
@ -559,10 +689,15 @@ class SortLibraryMangaState extends _$SortLibraryMangaState {
|
||||||
..index = index
|
..index = index
|
||||||
..reverse = state.index == index ? !reverse : reverse;
|
..reverse = state.index == index ? !reverse : reverse;
|
||||||
|
|
||||||
if (isManga) {
|
switch (itemType) {
|
||||||
appSettings = settings..sortLibraryManga = value;
|
case ItemType.manga:
|
||||||
} else {
|
appSettings = settings..sortLibraryManga = value;
|
||||||
appSettings = settings..sortLibraryAnime = value;
|
break;
|
||||||
|
case ItemType.anime:
|
||||||
|
appSettings = settings..sortLibraryAnime = value;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
appSettings = settings..sortLibraryNovel = value;
|
||||||
}
|
}
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
isar.settings.putSync(appSettings);
|
isar.settings.putSync(appSettings);
|
||||||
|
|
|
||||||
File diff suppressed because it is too large
Load diff
|
|
@ -11,11 +11,11 @@ part 'local_archive.g.dart';
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
Future importArchivesFromFile(Ref ref, Manga? mManga,
|
Future importArchivesFromFile(Ref ref, Manga? mManga,
|
||||||
{required bool isManga, required bool init}) async {
|
{required ItemType itemType, required bool init}) async {
|
||||||
FilePickerResult? result = await FilePicker.platform.pickFiles(
|
FilePickerResult? result = await FilePicker.platform.pickFiles(
|
||||||
allowMultiple: true,
|
allowMultiple: true,
|
||||||
type: FileType.custom,
|
type: FileType.custom,
|
||||||
allowedExtensions: isManga
|
allowedExtensions: itemType == ItemType.manga
|
||||||
? ['cbz', 'zip']
|
? ['cbz', 'zip']
|
||||||
: ['mp4', 'mov', 'avi', 'flv', 'wmv', 'mpeg', 'mkv']);
|
: ['mp4', 'mov', 'avi', 'flv', 'wmv', 'mpeg', 'mkv']);
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
|
|
@ -25,7 +25,7 @@ Future importArchivesFromFile(Ref ref, Manga? mManga,
|
||||||
favorite: true,
|
favorite: true,
|
||||||
source: 'archive',
|
source: 'archive',
|
||||||
author: '',
|
author: '',
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
genre: [],
|
genre: [],
|
||||||
imageUrl: '',
|
imageUrl: '',
|
||||||
lang: '',
|
lang: '',
|
||||||
|
|
@ -39,20 +39,20 @@ Future importArchivesFromFile(Ref ref, Manga? mManga,
|
||||||
artist: '',
|
artist: '',
|
||||||
);
|
);
|
||||||
for (var file in result.files.reversed.toList()) {
|
for (var file in result.files.reversed.toList()) {
|
||||||
(String, LocalExtensionType, Uint8List, String)? data = isManga
|
(String, LocalExtensionType, Uint8List, String)? data = itemType == ItemType.manga
|
||||||
? await ref.watch(getArchivesDataFromFileProvider(file.path!).future)
|
? await ref.watch(getArchivesDataFromFileProvider(file.path!).future)
|
||||||
: null;
|
: null;
|
||||||
String name = _getName(file.path!);
|
String name = _getName(file.path!);
|
||||||
|
|
||||||
if (init) {
|
if (init) {
|
||||||
manga.customCoverImage = isManga ? data!.$3 : null;
|
manga.customCoverImage = itemType == ItemType.manga ? data!.$3 : null;
|
||||||
}
|
}
|
||||||
|
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
isar.mangas.putSync(manga);
|
isar.mangas.putSync(manga);
|
||||||
final chapters = Chapter(
|
final chapters = Chapter(
|
||||||
name: isManga ? data!.$1 : name,
|
name: itemType == ItemType.manga ? data!.$1 : name,
|
||||||
archivePath: isManga ? data!.$4 : file.path,
|
archivePath: itemType == ItemType.manga ? data!.$4 : file.path,
|
||||||
mangaId: manga.id)
|
mangaId: manga.id)
|
||||||
..manga.value = manga;
|
..manga.value = manga;
|
||||||
isar.chapters.putSync(chapters);
|
isar.chapters.putSync(chapters);
|
||||||
|
|
|
||||||
|
|
@ -42,12 +42,12 @@ class ImportArchivesFromFileFamily extends Family<AsyncValue> {
|
||||||
/// See also [importArchivesFromFile].
|
/// See also [importArchivesFromFile].
|
||||||
ImportArchivesFromFileProvider call(
|
ImportArchivesFromFileProvider call(
|
||||||
Manga? mManga, {
|
Manga? mManga, {
|
||||||
required bool isManga,
|
required ItemType itemType,
|
||||||
required bool init,
|
required bool init,
|
||||||
}) {
|
}) {
|
||||||
return ImportArchivesFromFileProvider(
|
return ImportArchivesFromFileProvider(
|
||||||
mManga,
|
mManga,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
init: init,
|
init: init,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -58,7 +58,7 @@ class ImportArchivesFromFileFamily extends Family<AsyncValue> {
|
||||||
) {
|
) {
|
||||||
return call(
|
return call(
|
||||||
provider.mManga,
|
provider.mManga,
|
||||||
isManga: provider.isManga,
|
itemType: provider.itemType,
|
||||||
init: provider.init,
|
init: provider.init,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -84,13 +84,13 @@ class ImportArchivesFromFileProvider
|
||||||
/// See also [importArchivesFromFile].
|
/// See also [importArchivesFromFile].
|
||||||
ImportArchivesFromFileProvider(
|
ImportArchivesFromFileProvider(
|
||||||
Manga? mManga, {
|
Manga? mManga, {
|
||||||
required bool isManga,
|
required ItemType itemType,
|
||||||
required bool init,
|
required bool init,
|
||||||
}) : this._internal(
|
}) : this._internal(
|
||||||
(ref) => importArchivesFromFile(
|
(ref) => importArchivesFromFile(
|
||||||
ref as ImportArchivesFromFileRef,
|
ref as ImportArchivesFromFileRef,
|
||||||
mManga,
|
mManga,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
init: init,
|
init: init,
|
||||||
),
|
),
|
||||||
from: importArchivesFromFileProvider,
|
from: importArchivesFromFileProvider,
|
||||||
|
|
@ -103,7 +103,7 @@ class ImportArchivesFromFileProvider
|
||||||
allTransitiveDependencies:
|
allTransitiveDependencies:
|
||||||
ImportArchivesFromFileFamily._allTransitiveDependencies,
|
ImportArchivesFromFileFamily._allTransitiveDependencies,
|
||||||
mManga: mManga,
|
mManga: mManga,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
init: init,
|
init: init,
|
||||||
);
|
);
|
||||||
|
|
||||||
|
|
@ -115,12 +115,12 @@ class ImportArchivesFromFileProvider
|
||||||
required super.debugGetCreateSourceHash,
|
required super.debugGetCreateSourceHash,
|
||||||
required super.from,
|
required super.from,
|
||||||
required this.mManga,
|
required this.mManga,
|
||||||
required this.isManga,
|
required this.itemType,
|
||||||
required this.init,
|
required this.init,
|
||||||
}) : super.internal();
|
}) : super.internal();
|
||||||
|
|
||||||
final Manga? mManga;
|
final Manga? mManga;
|
||||||
final bool isManga;
|
final ItemType itemType;
|
||||||
final bool init;
|
final bool init;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
@ -137,7 +137,7 @@ class ImportArchivesFromFileProvider
|
||||||
allTransitiveDependencies: null,
|
allTransitiveDependencies: null,
|
||||||
debugGetCreateSourceHash: null,
|
debugGetCreateSourceHash: null,
|
||||||
mManga: mManga,
|
mManga: mManga,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
init: init,
|
init: init,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
@ -152,7 +152,7 @@ class ImportArchivesFromFileProvider
|
||||||
bool operator ==(Object other) {
|
bool operator ==(Object other) {
|
||||||
return other is ImportArchivesFromFileProvider &&
|
return other is ImportArchivesFromFileProvider &&
|
||||||
other.mManga == mManga &&
|
other.mManga == mManga &&
|
||||||
other.isManga == isManga &&
|
other.itemType == itemType &&
|
||||||
other.init == init;
|
other.init == init;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -160,7 +160,7 @@ class ImportArchivesFromFileProvider
|
||||||
int get hashCode {
|
int get hashCode {
|
||||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||||
hash = _SystemHash.combine(hash, mManga.hashCode);
|
hash = _SystemHash.combine(hash, mManga.hashCode);
|
||||||
hash = _SystemHash.combine(hash, isManga.hashCode);
|
hash = _SystemHash.combine(hash, itemType.hashCode);
|
||||||
hash = _SystemHash.combine(hash, init.hashCode);
|
hash = _SystemHash.combine(hash, init.hashCode);
|
||||||
|
|
||||||
return _SystemHash.finish(hash);
|
return _SystemHash.finish(hash);
|
||||||
|
|
@ -173,8 +173,8 @@ mixin ImportArchivesFromFileRef on AutoDisposeFutureProviderRef<Object?> {
|
||||||
/// The parameter `mManga` of this provider.
|
/// The parameter `mManga` of this provider.
|
||||||
Manga? get mManga;
|
Manga? get mManga;
|
||||||
|
|
||||||
/// The parameter `isManga` of this provider.
|
/// The parameter `itemType` of this provider.
|
||||||
bool get isManga;
|
ItemType get itemType;
|
||||||
|
|
||||||
/// The parameter `init` of this provider.
|
/// The parameter `init` of this provider.
|
||||||
bool get init;
|
bool get init;
|
||||||
|
|
@ -188,7 +188,7 @@ class _ImportArchivesFromFileProviderElement
|
||||||
@override
|
@override
|
||||||
Manga? get mManga => (origin as ImportArchivesFromFileProvider).mManga;
|
Manga? get mManga => (origin as ImportArchivesFromFileProvider).mManga;
|
||||||
@override
|
@override
|
||||||
bool get isManga => (origin as ImportArchivesFromFileProvider).isManga;
|
ItemType get itemType => (origin as ImportArchivesFromFileProvider).itemType;
|
||||||
@override
|
@override
|
||||||
bool get init => (origin as ImportArchivesFromFileProvider).init;
|
bool get init => (origin as ImportArchivesFromFileProvider).init;
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -29,7 +29,7 @@ class LibraryGridViewWidget extends StatefulWidget {
|
||||||
final bool downloadedChapter;
|
final bool downloadedChapter;
|
||||||
final bool continueReaderBtn;
|
final bool continueReaderBtn;
|
||||||
final bool localSource;
|
final bool localSource;
|
||||||
final bool isManga;
|
final ItemType itemType;
|
||||||
const LibraryGridViewWidget(
|
const LibraryGridViewWidget(
|
||||||
{super.key,
|
{super.key,
|
||||||
required this.entriesManga,
|
required this.entriesManga,
|
||||||
|
|
@ -40,7 +40,7 @@ class LibraryGridViewWidget extends StatefulWidget {
|
||||||
required this.continueReaderBtn,
|
required this.continueReaderBtn,
|
||||||
required this.mangaIdsList,
|
required this.mangaIdsList,
|
||||||
required this.localSource,
|
required this.localSource,
|
||||||
required this.isManga});
|
required this.itemType});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
State<LibraryGridViewWidget> createState() => _LibraryGridViewWidgetState();
|
State<LibraryGridViewWidget> createState() => _LibraryGridViewWidgetState();
|
||||||
|
|
@ -51,10 +51,10 @@ class _LibraryGridViewWidgetState extends State<LibraryGridViewWidget> {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return Consumer(builder: (context, ref, child) {
|
return Consumer(builder: (context, ref, child) {
|
||||||
final isLongPressed = ref.watch(isLongPressedMangaStateProvider);
|
final isLongPressed = ref.watch(isLongPressedMangaStateProvider);
|
||||||
final isManga = widget.isManga;
|
final itemType = widget.itemType;
|
||||||
|
|
||||||
final gridSize =
|
final gridSize =
|
||||||
ref.watch(libraryGridSizeStateProvider(isManga: isManga));
|
ref.watch(libraryGridSizeStateProvider(itemType: itemType));
|
||||||
return GridViewWidget(
|
return GridViewWidget(
|
||||||
gridSize: gridSize,
|
gridSize: gridSize,
|
||||||
childAspectRatio: widget.isComfortableGrid ? 0.642 : 0.69,
|
childAspectRatio: widget.isComfortableGrid ? 0.642 : 0.69,
|
||||||
|
|
@ -97,9 +97,9 @@ class _LibraryGridViewWidgetState extends State<LibraryGridViewWidget> {
|
||||||
mangaM: entry,
|
mangaM: entry,
|
||||||
source: entry.source!);
|
source: entry.source!);
|
||||||
ref.invalidate(getAllMangaWithoutCategoriesStreamProvider(
|
ref.invalidate(getAllMangaWithoutCategoriesStreamProvider(
|
||||||
isManga: widget.isManga));
|
itemType: widget.itemType));
|
||||||
ref.invalidate(getAllMangaStreamProvider(
|
ref.invalidate(getAllMangaStreamProvider(
|
||||||
categoryId: null, isManga: widget.isManga));
|
categoryId: null, itemType: widget.itemType));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () {
|
onLongPress: () {
|
||||||
|
|
@ -279,7 +279,7 @@ class _LibraryGridViewWidgetState extends State<LibraryGridViewWidget> {
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.and()
|
.and()
|
||||||
.chapter((q) => q.manga((q) =>
|
.chapter((q) => q.manga((q) =>
|
||||||
q.isMangaEqualTo(entry.isManga!)))
|
q.itemTypeEqualTo(entry.itemType!)))
|
||||||
.watch(fireImmediately: true),
|
.watch(fireImmediately: true),
|
||||||
builder: (context, snapshot) {
|
builder: (context, snapshot) {
|
||||||
if (snapshot.hasData &&
|
if (snapshot.hasData &&
|
||||||
|
|
|
||||||
|
|
@ -59,9 +59,9 @@ class LibraryListViewWidget extends StatelessWidget {
|
||||||
mangaM: entry,
|
mangaM: entry,
|
||||||
source: entry.source!);
|
source: entry.source!);
|
||||||
ref.invalidate(getAllMangaWithoutCategoriesStreamProvider(
|
ref.invalidate(getAllMangaWithoutCategoriesStreamProvider(
|
||||||
isManga: entry.isManga));
|
itemType: entry.itemType));
|
||||||
ref.invalidate(getAllMangaStreamProvider(
|
ref.invalidate(getAllMangaStreamProvider(
|
||||||
categoryId: null, isManga: entry.isManga));
|
categoryId: null, itemType: entry.itemType));
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
onLongPress: () {
|
onLongPress: () {
|
||||||
|
|
@ -264,7 +264,7 @@ class LibraryListViewWidget extends StatelessWidget {
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.and()
|
.and()
|
||||||
.chapter((q) => q.manga((q) =>
|
.chapter((q) => q.manga((q) =>
|
||||||
q.isMangaEqualTo(entry.isManga!)))
|
q.itemTypeEqualTo(entry.itemType)))
|
||||||
.watch(fireImmediately: true),
|
.watch(fireImmediately: true),
|
||||||
builder: (context, snapshot) {
|
builder: (context, snapshot) {
|
||||||
if (snapshot.hasData &&
|
if (snapshot.hasData &&
|
||||||
|
|
|
||||||
|
|
@ -39,14 +39,15 @@ class MainScreen extends ConsumerWidget {
|
||||||
routerCurrentLocationStateProvider(context),
|
routerCurrentLocationStateProvider(context),
|
||||||
);
|
);
|
||||||
bool isReadingScreen =
|
bool isReadingScreen =
|
||||||
location == '/mangareaderview' || location == '/animePlayerView';
|
location == '/mangaReaderView' || location == '/animePlayerView' || location == '/novelReaderView';
|
||||||
int currentIndex = switch (location) {
|
int currentIndex = switch (location) {
|
||||||
null || '/MangaLibrary' => 0,
|
null || '/MangaLibrary' => 0,
|
||||||
'/AnimeLibrary' => 1,
|
'/AnimeLibrary' => 1,
|
||||||
'/updates' => 2,
|
'/updates' => 2,
|
||||||
'/history' => 3,
|
'/history' => 3,
|
||||||
'/browse' => 4,
|
'/browse' => 4,
|
||||||
_ => 5,
|
'/NovelLibrary' => 5,
|
||||||
|
_ => 6,
|
||||||
};
|
};
|
||||||
|
|
||||||
final incognitoMode = ref.watch(incognitoModeStateProvider);
|
final incognitoMode = ref.watch(incognitoModeStateProvider);
|
||||||
|
|
@ -95,6 +96,7 @@ class MainScreen extends ConsumerWidget {
|
||||||
null => 100,
|
null => 100,
|
||||||
!= '/MangaLibrary' &&
|
!= '/MangaLibrary' &&
|
||||||
!= '/AnimeLibrary' &&
|
!= '/AnimeLibrary' &&
|
||||||
|
!= '/NovelLibrary' &&
|
||||||
!= '/history' &&
|
!= '/history' &&
|
||||||
!= '/updates' &&
|
!= '/updates' &&
|
||||||
!= '/browse' &&
|
!= '/browse' &&
|
||||||
|
|
@ -134,6 +136,15 @@ class MainScreen extends ConsumerWidget {
|
||||||
padding: const EdgeInsets.only(
|
padding: const EdgeInsets.only(
|
||||||
top: 5),
|
top: 5),
|
||||||
child: Text(l10n.anime))),
|
child: Text(l10n.anime))),
|
||||||
|
NavigationRailDestination(
|
||||||
|
selectedIcon: const Icon(
|
||||||
|
Icons.local_library),
|
||||||
|
icon: const Icon(Icons
|
||||||
|
.local_library_outlined),
|
||||||
|
label: Padding(
|
||||||
|
padding: const EdgeInsets.only(
|
||||||
|
top: 5),
|
||||||
|
child: Text(l10n.novel))),
|
||||||
NavigationRailDestination(
|
NavigationRailDestination(
|
||||||
selectedIcon:
|
selectedIcon:
|
||||||
const Icon(Icons.new_releases),
|
const Icon(Icons.new_releases),
|
||||||
|
|
@ -180,9 +191,10 @@ class MainScreen extends ConsumerWidget {
|
||||||
final fn = switch (newIndex) {
|
final fn = switch (newIndex) {
|
||||||
0 => route.go('/MangaLibrary'),
|
0 => route.go('/MangaLibrary'),
|
||||||
1 => route.go('/AnimeLibrary'),
|
1 => route.go('/AnimeLibrary'),
|
||||||
2 => route.go('/updates'),
|
2 => route.go('/NovelLibrary'),
|
||||||
3 => route.go('/history'),
|
3 => route.go('/updates'),
|
||||||
4 => route.go('/browse'),
|
4 => route.go('/history'),
|
||||||
|
5 => route.go('/browse'),
|
||||||
_ => route.go('/more'),
|
_ => route.go('/more'),
|
||||||
};
|
};
|
||||||
fn;
|
fn;
|
||||||
|
|
@ -216,6 +228,7 @@ class MainScreen extends ConsumerWidget {
|
||||||
null => null,
|
null => null,
|
||||||
!= '/MangaLibrary' &&
|
!= '/MangaLibrary' &&
|
||||||
!= '/AnimeLibrary' &&
|
!= '/AnimeLibrary' &&
|
||||||
|
!= '/NovelLibrary' &&
|
||||||
!= '/history' &&
|
!= '/history' &&
|
||||||
!= '/updates' &&
|
!= '/updates' &&
|
||||||
!= '/browse' &&
|
!= '/browse' &&
|
||||||
|
|
|
||||||
|
|
@ -21,10 +21,8 @@ Future<void> migration(Ref ref) async {
|
||||||
.chapterIdIsNull()
|
.chapterIdIsNull()
|
||||||
.or()
|
.or()
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.isMangaIsNull()
|
|
||||||
.findAllSync();
|
.findAllSync();
|
||||||
final tracks =
|
final tracks = isar.tracks.filter().idIsNotNull().findAllSync();
|
||||||
isar.tracks.filter().idIsNotNull().isMangaIsNull().findAllSync();
|
|
||||||
|
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
//mangaId in chapter
|
//mangaId in chapter
|
||||||
|
|
@ -40,14 +38,17 @@ Future<void> migration(Ref ref) async {
|
||||||
//chapterId and isManga in History
|
//chapterId and isManga in History
|
||||||
for (var history in histories) {
|
for (var history in histories) {
|
||||||
final chapterId = history.chapter.value?.id;
|
final chapterId = history.chapter.value?.id;
|
||||||
final isManga = history.chapter.value?.manga.value?.isManga;
|
final itemType =
|
||||||
|
history.chapter.value?.manga.value?.itemType ?? ItemType.manga;
|
||||||
isar.historys.putSync(history
|
isar.historys.putSync(history
|
||||||
..chapterId = chapterId
|
..chapterId = chapterId
|
||||||
..isManga = isManga);
|
..itemType = itemType);
|
||||||
}
|
}
|
||||||
// isManga in Track
|
// isManga in Track
|
||||||
for (var track in tracks) {
|
for (var track in tracks) {
|
||||||
final isManga = isar.mangas.getSync(track.mangaId!)?.isManga;
|
final isManga =
|
||||||
|
(isar.mangas.getSync(track.mangaId!)?.itemType ?? ItemType.manga) ==
|
||||||
|
ItemType.manga;
|
||||||
isar.tracks.putSync(track..isManga = isManga);
|
isar.tracks.putSync(track..isManga = isManga);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -509,7 +509,12 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
||||||
if (value == 0) {
|
if (value == 0) {
|
||||||
context.push("/categories", extra: (
|
context.push("/categories", extra: (
|
||||||
true,
|
true,
|
||||||
widget.manga!.isManga! ? 0 : 1
|
widget.manga!.itemType == ItemType.manga
|
||||||
|
? 0
|
||||||
|
: widget.manga!.itemType ==
|
||||||
|
ItemType.anime
|
||||||
|
? 1
|
||||||
|
: 2
|
||||||
));
|
));
|
||||||
} else if (value == 1) {
|
} else if (value == 1) {
|
||||||
} else if (value == 2) {
|
} else if (value == 2) {
|
||||||
|
|
@ -583,7 +588,9 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
||||||
8),
|
8),
|
||||||
child: Text(
|
child: Text(
|
||||||
widget.manga!
|
widget.manga!
|
||||||
.isManga!
|
.itemType !=
|
||||||
|
ItemType
|
||||||
|
.anime
|
||||||
? l10n.n_chapters(
|
? l10n.n_chapters(
|
||||||
chapters
|
chapters
|
||||||
.length)
|
.length)
|
||||||
|
|
@ -612,7 +619,10 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
||||||
color: context
|
color: context
|
||||||
.secondaryColor),
|
.secondaryColor),
|
||||||
label: Text(
|
label: Text(
|
||||||
widget.manga!.isManga!
|
widget.manga!
|
||||||
|
.itemType !=
|
||||||
|
ItemType
|
||||||
|
.anime
|
||||||
? l10n
|
? l10n
|
||||||
.add_chapters
|
.add_chapters
|
||||||
: l10n
|
: l10n
|
||||||
|
|
@ -634,8 +644,9 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
||||||
manga: manga);
|
manga: manga);
|
||||||
} else {
|
} else {
|
||||||
await ref.watch(importArchivesFromFileProvider(
|
await ref.watch(importArchivesFromFileProvider(
|
||||||
isManga: manga
|
itemType:
|
||||||
.isManga!,
|
manga
|
||||||
|
.itemType,
|
||||||
manga,
|
manga,
|
||||||
init:
|
init:
|
||||||
false)
|
false)
|
||||||
|
|
@ -1360,7 +1371,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
||||||
padding:
|
padding:
|
||||||
const EdgeInsets.symmetric(horizontal: 8),
|
const EdgeInsets.symmetric(horizontal: 8),
|
||||||
child: Text(
|
child: Text(
|
||||||
widget.manga!.isManga!
|
widget.manga!.itemType != ItemType.anime
|
||||||
? l10n.n_chapters(chapterLength)
|
? l10n.n_chapters(chapterLength)
|
||||||
: l10n.n_episodes(chapterLength),
|
: l10n.n_episodes(chapterLength),
|
||||||
style: const TextStyle(
|
style: const TextStyle(
|
||||||
|
|
@ -1377,7 +1388,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
||||||
icon: Icon(Icons.add,
|
icon: Icon(Icons.add,
|
||||||
color: context.secondaryColor),
|
color: context.secondaryColor),
|
||||||
label: Text(
|
label: Text(
|
||||||
widget.manga!.isManga!
|
widget.manga!.itemType != ItemType.anime
|
||||||
? l10n.add_chapters
|
? l10n.add_chapters
|
||||||
: l10n.add_episodes,
|
: l10n.add_episodes,
|
||||||
style: TextStyle(
|
style: TextStyle(
|
||||||
|
|
@ -1391,7 +1402,7 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
||||||
} else {
|
} else {
|
||||||
await ref.watch(
|
await ref.watch(
|
||||||
importArchivesFromFileProvider(
|
importArchivesFromFileProvider(
|
||||||
isManga: manga.isManga!,
|
itemType: manga.itemType,
|
||||||
manga,
|
manga,
|
||||||
init: false)
|
init: false)
|
||||||
.future);
|
.future);
|
||||||
|
|
@ -1642,7 +1653,8 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
||||||
final trackSearch =
|
final trackSearch =
|
||||||
await trackersSearchraggableMenu(
|
await trackersSearchraggableMenu(
|
||||||
context,
|
context,
|
||||||
isManga: widget.manga!.isManga!,
|
isManga: widget.manga!.itemType !=
|
||||||
|
ItemType.anime,
|
||||||
track: Track(
|
track: Track(
|
||||||
status:
|
status:
|
||||||
TrackStatus.planToRead,
|
TrackStatus.planToRead,
|
||||||
|
|
@ -1960,14 +1972,16 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
||||||
mangaId: widget.manga!.id!,
|
mangaId: widget.manga!.id!,
|
||||||
syncId: entries[index].syncId!,
|
syncId: entries[index].syncId!,
|
||||||
trackRes: trackRes.first,
|
trackRes: trackRes.first,
|
||||||
isManga: widget.manga!.isManga!)
|
isManga:
|
||||||
|
widget.manga!.itemType == ItemType.manga)
|
||||||
: TrackListile(
|
: TrackListile(
|
||||||
text: l10nLocalizations(context)!.add_tracker,
|
text: l10nLocalizations(context)!.add_tracker,
|
||||||
onTap: () async {
|
onTap: () async {
|
||||||
final trackSearch =
|
final trackSearch =
|
||||||
await trackersSearchraggableMenu(
|
await trackersSearchraggableMenu(
|
||||||
context,
|
context,
|
||||||
isManga: widget.manga!.isManga!,
|
isManga: widget.manga!.itemType !=
|
||||||
|
ItemType.anime,
|
||||||
track: Track(
|
track: Track(
|
||||||
status: TrackStatus.planToRead,
|
status: TrackStatus.planToRead,
|
||||||
syncId: entries[index].syncId!,
|
syncId: entries[index].syncId!,
|
||||||
|
|
@ -1977,7 +1991,9 @@ class _MangaDetailViewState extends ConsumerState<MangaDetailView>
|
||||||
await ref
|
await ref
|
||||||
.read(trackStateProvider(
|
.read(trackStateProvider(
|
||||||
track: null,
|
track: null,
|
||||||
isManga: widget.manga!.isManga!)
|
isManga:
|
||||||
|
widget.manga!.itemType !=
|
||||||
|
ItemType.anime)
|
||||||
.notifier)
|
.notifier)
|
||||||
.setTrackSearch(
|
.setTrackSearch(
|
||||||
trackSearch,
|
trackSearch,
|
||||||
|
|
|
||||||
|
|
@ -55,7 +55,7 @@ class _MangaDetailsViewState extends ConsumerState<MangaDetailsView> {
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.and()
|
.and()
|
||||||
.chapter((q) => q.manga(
|
.chapter((q) => q.manga(
|
||||||
(q) => q.isMangaEqualTo(widget.manga.isManga!)))
|
(q) => q.itemTypeEqualTo(widget.manga.itemType)))
|
||||||
.watch(fireImmediately: true),
|
.watch(fireImmediately: true),
|
||||||
builder: (context, snapshot) {
|
builder: (context, snapshot) {
|
||||||
final isFr =
|
final isFr =
|
||||||
|
|
@ -196,7 +196,7 @@ class _MangaDetailsViewState extends ConsumerState<MangaDetailsView> {
|
||||||
.filter()
|
.filter()
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.and()
|
.and()
|
||||||
.forMangaEqualTo(widget.manga.isManga)
|
.forItemTypeEqualTo(widget.manga.itemType)
|
||||||
.isNotEmptySync();
|
.isNotEmptySync();
|
||||||
if (checkCategoryList) {
|
if (checkCategoryList) {
|
||||||
_openCategory(widget.manga);
|
_openCategory(widget.manga);
|
||||||
|
|
@ -257,7 +257,7 @@ class _MangaDetailsViewState extends ConsumerState<MangaDetailsView> {
|
||||||
.filter()
|
.filter()
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.and()
|
.and()
|
||||||
.forMangaEqualTo(widget.manga.isManga)
|
.forItemTypeEqualTo(widget.manga.itemType)
|
||||||
.watch(fireImmediately: true),
|
.watch(fireImmediately: true),
|
||||||
builder: (context, snapshot) {
|
builder: (context, snapshot) {
|
||||||
if (snapshot.hasData && snapshot.data!.isNotEmpty) {
|
if (snapshot.hasData && snapshot.data!.isNotEmpty) {
|
||||||
|
|
@ -294,8 +294,14 @@ class _MangaDetailsViewState extends ConsumerState<MangaDetailsView> {
|
||||||
children: [
|
children: [
|
||||||
TextButton(
|
TextButton(
|
||||||
onPressed: () {
|
onPressed: () {
|
||||||
context.push("/categories",
|
context.push("/categories", extra: (
|
||||||
extra: (true, widget.manga.isManga! ? 0 : 1));
|
true,
|
||||||
|
widget.manga.itemType == ItemType.manga
|
||||||
|
? 0
|
||||||
|
: widget.manga.itemType == ItemType.anime
|
||||||
|
? 1
|
||||||
|
: 2
|
||||||
|
));
|
||||||
Navigator.pop(context);
|
Navigator.pop(context);
|
||||||
},
|
},
|
||||||
child: Text(l10n.edit)),
|
child: Text(l10n.edit)),
|
||||||
|
|
|
||||||
|
|
@ -49,7 +49,7 @@ Future<dynamic> updateMangaDetail(Ref ref,
|
||||||
..link = getManga.link?.trim().trimLeft().trimRight() ?? manga.link
|
..link = getManga.link?.trim().trimLeft().trimRight() ?? manga.link
|
||||||
..source = manga.source
|
..source = manga.source
|
||||||
..lang = manga.lang
|
..lang = manga.lang
|
||||||
..isManga = source.isManga
|
..itemType = source.itemType
|
||||||
..lastUpdate = DateTime.now().millisecondsSinceEpoch;
|
..lastUpdate = DateTime.now().millisecondsSinceEpoch;
|
||||||
final checkManga = isar.mangas.getSync(mangaId);
|
final checkManga = isar.mangas.getSync(mangaId);
|
||||||
if (checkManga!.chapters.isNotEmpty && isInit) {
|
if (checkManga!.chapters.isNotEmpty && isInit) {
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:mangayomi/models/chapter.dart';
|
import 'package:mangayomi/models/chapter.dart';
|
||||||
|
import 'package:mangayomi/models/manga.dart';
|
||||||
import 'package:mangayomi/providers/l10n_providers.dart';
|
import 'package:mangayomi/providers/l10n_providers.dart';
|
||||||
import 'package:mangayomi/utils/date.dart';
|
import 'package:mangayomi/utils/date.dart';
|
||||||
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
|
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
|
||||||
|
|
@ -89,7 +90,7 @@ class ChapterListTileWidget extends ConsumerWidget {
|
||||||
children: [
|
children: [
|
||||||
const Text(' • '),
|
const Text(' • '),
|
||||||
Text(
|
Text(
|
||||||
!chapter.manga.value!.isManga!
|
chapter.manga.value!.itemType == ItemType.anime
|
||||||
? l10n.episode_progress(Duration(
|
? l10n.episode_progress(Duration(
|
||||||
milliseconds:
|
milliseconds:
|
||||||
int.parse(chapter.lastPageRead!))
|
int.parse(chapter.lastPageRead!))
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,7 @@
|
||||||
import 'dart:convert';
|
import 'dart:convert';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
import 'dart:typed_data';
|
import 'dart:typed_data';
|
||||||
|
import 'package:mangayomi/models/manga.dart';
|
||||||
import 'package:mangayomi/models/page.dart';
|
import 'package:mangayomi/models/page.dart';
|
||||||
import 'package:mangayomi/services/background_downloader/background_downloader.dart';
|
import 'package:mangayomi/services/background_downloader/background_downloader.dart';
|
||||||
import 'package:isar/isar.dart';
|
import 'package:isar/isar.dart';
|
||||||
|
|
@ -45,9 +46,15 @@ Future<List<PageUrl>> downloadChapter(
|
||||||
: "";
|
: "";
|
||||||
final chapterName = chapter.name!.replaceForbiddenCharacters(' ');
|
final chapterName = chapter.name!.replaceForbiddenCharacters(' ');
|
||||||
|
|
||||||
final isManga = chapter.manga.value!.isManga!;
|
final itemType = chapter.manga.value!.itemType;
|
||||||
|
final isManga = itemType == ItemType.manga;
|
||||||
|
final itemTypePath = itemType == ItemType.manga
|
||||||
|
? "Manga"
|
||||||
|
: itemType == ItemType.anime
|
||||||
|
? "Anime"
|
||||||
|
: "Novel";
|
||||||
final finalPath =
|
final finalPath =
|
||||||
"downloads/${isManga ? "Manga" : "Anime"}/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}${isManga ? "/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}" : ""}";
|
"downloads/$itemTypePath/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}${isManga ? "/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}" : ""}";
|
||||||
path = Directory("${path1!.path}$finalPath/");
|
path = Directory("${path1!.path}$finalPath/");
|
||||||
Map<String, String> videoHeader = {};
|
Map<String, String> videoHeader = {};
|
||||||
bool hasM3U8File = false;
|
bool hasM3U8File = false;
|
||||||
|
|
|
||||||
|
|
@ -4,6 +4,7 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:mangayomi/eval/dart/model/m_manga.dart';
|
import 'package:mangayomi/eval/dart/model/m_manga.dart';
|
||||||
import 'package:mangayomi/eval/dart/model/m_pages.dart';
|
import 'package:mangayomi/eval/dart/model/m_pages.dart';
|
||||||
|
import 'package:mangayomi/models/manga.dart';
|
||||||
import 'package:mangayomi/models/settings.dart';
|
import 'package:mangayomi/models/settings.dart';
|
||||||
import 'package:mangayomi/models/source.dart';
|
import 'package:mangayomi/models/source.dart';
|
||||||
import 'package:mangayomi/modules/library/providers/library_state_provider.dart';
|
import 'package:mangayomi/modules/library/providers/library_state_provider.dart';
|
||||||
|
|
@ -520,14 +521,14 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
|
||||||
return buildProgressIndicator();
|
return buildProgressIndicator();
|
||||||
}
|
}
|
||||||
return MangaHomeImageCardListTile(
|
return MangaHomeImageCardListTile(
|
||||||
isManga: source.isManga ?? true,
|
itemType: source.itemType,
|
||||||
manga: _mangaList[index],
|
manga: _mangaList[index],
|
||||||
source: source);
|
source: source);
|
||||||
})
|
})
|
||||||
: Consumer(builder: (context, ref, child) {
|
: Consumer(builder: (context, ref, child) {
|
||||||
final gridSize = ref.watch(
|
final gridSize = ref.watch(
|
||||||
libraryGridSizeStateProvider(
|
libraryGridSizeStateProvider(
|
||||||
isManga: source.isManga!));
|
itemType: source.itemType));
|
||||||
|
|
||||||
return GridViewWidget(
|
return GridViewWidget(
|
||||||
gridSize: gridSize,
|
gridSize: gridSize,
|
||||||
|
|
@ -540,7 +541,7 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
|
||||||
return buildProgressIndicator();
|
return buildProgressIndicator();
|
||||||
}
|
}
|
||||||
return MangaHomeImageCard(
|
return MangaHomeImageCard(
|
||||||
isManga: source.isManga ?? true,
|
itemType: source.itemType,
|
||||||
manga: _mangaList[index],
|
manga: _mangaList[index],
|
||||||
source: source,
|
source: source,
|
||||||
isComfortableGrid: isComfortableGrid,
|
isComfortableGrid: isComfortableGrid,
|
||||||
|
|
@ -639,14 +640,14 @@ class _MangaHomeScreenState extends ConsumerState<MangaHomeScreen> {
|
||||||
|
|
||||||
class MangaHomeImageCard extends ConsumerStatefulWidget {
|
class MangaHomeImageCard extends ConsumerStatefulWidget {
|
||||||
final MManga manga;
|
final MManga manga;
|
||||||
final bool isManga;
|
final ItemType itemType;
|
||||||
final Source source;
|
final Source source;
|
||||||
final bool isComfortableGrid;
|
final bool isComfortableGrid;
|
||||||
const MangaHomeImageCard(
|
const MangaHomeImageCard(
|
||||||
{super.key,
|
{super.key,
|
||||||
required this.manga,
|
required this.manga,
|
||||||
required this.source,
|
required this.source,
|
||||||
required this.isManga,
|
required this.itemType,
|
||||||
required this.isComfortableGrid});
|
required this.isComfortableGrid});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
@ -662,7 +663,7 @@ class _MangaHomeImageCardState extends ConsumerState<MangaHomeImageCard>
|
||||||
return MangaImageCardWidget(
|
return MangaImageCardWidget(
|
||||||
getMangaDetail: widget.manga,
|
getMangaDetail: widget.manga,
|
||||||
source: widget.source,
|
source: widget.source,
|
||||||
isManga: widget.isManga,
|
itemType: widget.itemType,
|
||||||
isComfortableGrid: widget.isComfortableGrid);
|
isComfortableGrid: widget.isComfortableGrid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -672,13 +673,13 @@ class _MangaHomeImageCardState extends ConsumerState<MangaHomeImageCard>
|
||||||
|
|
||||||
class MangaHomeImageCardListTile extends ConsumerStatefulWidget {
|
class MangaHomeImageCardListTile extends ConsumerStatefulWidget {
|
||||||
final MManga manga;
|
final MManga manga;
|
||||||
final bool isManga;
|
final ItemType itemType;
|
||||||
final Source source;
|
final Source source;
|
||||||
const MangaHomeImageCardListTile(
|
const MangaHomeImageCardListTile(
|
||||||
{super.key,
|
{super.key,
|
||||||
required this.manga,
|
required this.manga,
|
||||||
required this.source,
|
required this.source,
|
||||||
required this.isManga});
|
required this.itemType});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
ConsumerState<MangaHomeImageCardListTile> createState() =>
|
ConsumerState<MangaHomeImageCardListTile> createState() =>
|
||||||
|
|
@ -695,7 +696,7 @@ class _MangaHomeImageCardListTileState
|
||||||
return MangaImageCardListTileWidget(
|
return MangaImageCardListTileWidget(
|
||||||
getMangaDetail: widget.manga,
|
getMangaDetail: widget.manga,
|
||||||
source: widget.source,
|
source: widget.source,
|
||||||
isManga: widget.isManga);
|
itemType: widget.itemType);
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import 'package:go_router/go_router.dart';
|
||||||
import 'package:isar/isar.dart';
|
import 'package:isar/isar.dart';
|
||||||
import 'package:mangayomi/main.dart';
|
import 'package:mangayomi/main.dart';
|
||||||
import 'package:mangayomi/models/chapter.dart';
|
import 'package:mangayomi/models/chapter.dart';
|
||||||
|
import 'package:mangayomi/models/manga.dart';
|
||||||
import 'package:mangayomi/models/source.dart';
|
import 'package:mangayomi/models/source.dart';
|
||||||
|
|
||||||
Future<void> pushMangaReaderView({
|
Future<void> pushMangaReaderView({
|
||||||
|
|
@ -23,19 +24,31 @@ Future<void> pushMangaReaderView({
|
||||||
.findAllSync()
|
.findAllSync()
|
||||||
.isNotEmpty;
|
.isNotEmpty;
|
||||||
if (sourceExist || chapter.manga.value!.isLocalArchive!) {
|
if (sourceExist || chapter.manga.value!.isLocalArchive!) {
|
||||||
if (chapter.manga.value!.isManga!) {
|
switch (chapter.manga.value!.itemType) {
|
||||||
await context.push('/mangareaderview', extra: chapter);
|
case ItemType.manga:
|
||||||
} else {
|
await context.push('/mangaReaderView', extra: chapter);
|
||||||
await context.push('/animePlayerView', extra: chapter);
|
break;
|
||||||
|
case ItemType.anime:
|
||||||
|
await context.push('/animePlayerView', extra: chapter);
|
||||||
|
break;
|
||||||
|
case ItemType.novel:
|
||||||
|
await context.push('/novelReaderView', extra: chapter);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void pushReplacementMangaReaderView(
|
void pushReplacementMangaReaderView(
|
||||||
{required BuildContext context, required Chapter chapter}) {
|
{required BuildContext context, required Chapter chapter}) {
|
||||||
if (chapter.manga.value!.isManga!) {
|
switch (chapter.manga.value!.itemType) {
|
||||||
context.pushReplacement('/mangareaderview', extra: chapter);
|
case ItemType.manga:
|
||||||
} else {
|
context.pushReplacement('/mangaReaderView', extra: chapter);
|
||||||
context.pushReplacement('/animePlayerView', extra: chapter);
|
break;
|
||||||
}
|
case ItemType.anime:
|
||||||
|
context.pushReplacement('/animePlayerView', extra: chapter);
|
||||||
|
break;
|
||||||
|
case ItemType.novel:
|
||||||
|
context.pushReplacement('/novelReaderView', extra: chapter);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -171,7 +171,7 @@ class ReaderController extends _$ReaderController {
|
||||||
history = History(
|
history = History(
|
||||||
mangaId: getManga().id,
|
mangaId: getManga().id,
|
||||||
date: DateTime.now().millisecondsSinceEpoch.toString(),
|
date: DateTime.now().millisecondsSinceEpoch.toString(),
|
||||||
isManga: getManga().isManga,
|
itemType: getManga().itemType,
|
||||||
chapterId: chapter.id)
|
chapterId: chapter.id)
|
||||||
..chapter.value = chapter;
|
..chapter.value = chapter;
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -379,7 +379,7 @@ extension ChapterExtensions on Chapter {
|
||||||
final tracks = isar.tracks
|
final tracks = isar.tracks
|
||||||
.filter()
|
.filter()
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.isMangaEqualTo(manga.isManga)
|
.isMangaEqualTo(manga.itemType == ItemType.manga)
|
||||||
.mangaIdEqualTo(manga.id!)
|
.mangaIdEqualTo(manga.id!)
|
||||||
.findAllSync();
|
.findAllSync();
|
||||||
|
|
||||||
|
|
@ -398,15 +398,17 @@ extension ChapterExtensions on Chapter {
|
||||||
track.status = TrackStatus.completed;
|
track.status = TrackStatus.completed;
|
||||||
track.finishedReadingDate = DateTime.now().millisecondsSinceEpoch;
|
track.finishedReadingDate = DateTime.now().millisecondsSinceEpoch;
|
||||||
} else {
|
} else {
|
||||||
track.status =
|
track.status = manga.itemType == ItemType.manga
|
||||||
manga.isManga! ? TrackStatus.reading : TrackStatus.watching;
|
? TrackStatus.reading
|
||||||
|
: TrackStatus.watching;
|
||||||
if (track.lastChapterRead == 1) {
|
if (track.lastChapterRead == 1) {
|
||||||
track.startedReadingDate = DateTime.now().millisecondsSinceEpoch;
|
track.startedReadingDate = DateTime.now().millisecondsSinceEpoch;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ref
|
ref
|
||||||
.read(trackStateProvider(track: track, isManga: manga.isManga)
|
.read(trackStateProvider(
|
||||||
|
track: track, isManga: manga.itemType == ItemType.manga)
|
||||||
.notifier)
|
.notifier)
|
||||||
.updateManga();
|
.updateManga();
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -171,7 +171,7 @@ class _CurrentIndexProviderElement
|
||||||
Chapter get chapter => (origin as CurrentIndexProvider).chapter;
|
Chapter get chapter => (origin as CurrentIndexProvider).chapter;
|
||||||
}
|
}
|
||||||
|
|
||||||
String _$readerControllerHash() => r'cc4f5fbe4192def4d19d9150340d305ba0ecf463';
|
String _$readerControllerHash() => r'6576f3506dc5ef309f870de3e5c6e92efe03eefd';
|
||||||
|
|
||||||
abstract class _$ReaderController extends BuildlessAutoDisposeNotifier<void> {
|
abstract class _$ReaderController extends BuildlessAutoDisposeNotifier<void> {
|
||||||
late final Chapter chapter;
|
late final Chapter chapter;
|
||||||
|
|
|
||||||
|
|
@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
import 'package:mangayomi/main.dart';
|
import 'package:mangayomi/main.dart';
|
||||||
import 'package:mangayomi/models/category.dart';
|
import 'package:mangayomi/models/category.dart';
|
||||||
|
import 'package:mangayomi/models/manga.dart';
|
||||||
import 'package:mangayomi/modules/more/categories/providers/isar_providers.dart';
|
import 'package:mangayomi/modules/more/categories/providers/isar_providers.dart';
|
||||||
import 'package:mangayomi/modules/more/categories/widgets/custom_textfield.dart';
|
import 'package:mangayomi/modules/more/categories/widgets/custom_textfield.dart';
|
||||||
import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart';
|
import 'package:mangayomi/modules/more/settings/sync/providers/sync_providers.dart';
|
||||||
|
|
@ -47,15 +48,19 @@ class _CategoriesScreenState extends ConsumerState<CategoriesScreen>
|
||||||
tabs: [
|
tabs: [
|
||||||
Tab(text: l10n.manga),
|
Tab(text: l10n.manga),
|
||||||
Tab(text: l10n.anime),
|
Tab(text: l10n.anime),
|
||||||
|
Tab(text: l10n.novel),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
body: TabBarView(controller: _tabBarController, children: const [
|
body: TabBarView(controller: _tabBarController, children: const [
|
||||||
CategoriesTab(
|
CategoriesTab(
|
||||||
isManga: true,
|
itemType: ItemType.manga,
|
||||||
),
|
),
|
||||||
CategoriesTab(
|
CategoriesTab(
|
||||||
isManga: false,
|
itemType: ItemType.anime,
|
||||||
|
),
|
||||||
|
CategoriesTab(
|
||||||
|
itemType: ItemType.novel,
|
||||||
)
|
)
|
||||||
]),
|
]),
|
||||||
),
|
),
|
||||||
|
|
@ -64,8 +69,8 @@ class _CategoriesScreenState extends ConsumerState<CategoriesScreen>
|
||||||
}
|
}
|
||||||
|
|
||||||
class CategoriesTab extends ConsumerStatefulWidget {
|
class CategoriesTab extends ConsumerStatefulWidget {
|
||||||
final bool isManga;
|
final ItemType itemType;
|
||||||
const CategoriesTab({required this.isManga, super.key});
|
const CategoriesTab({required this.itemType, super.key});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
ConsumerState<CategoriesTab> createState() => _CategoriesTabState();
|
ConsumerState<CategoriesTab> createState() => _CategoriesTabState();
|
||||||
|
|
@ -77,7 +82,7 @@ class _CategoriesTabState extends ConsumerState<CategoriesTab> {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final l10n = l10nLocalizations(context)!;
|
final l10n = l10nLocalizations(context)!;
|
||||||
final categories =
|
final categories =
|
||||||
ref.watch(getMangaCategorieStreamProvider(isManga: widget.isManga));
|
ref.watch(getMangaCategorieStreamProvider(itemType: widget.itemType));
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
body: categories.when(
|
body: categories.when(
|
||||||
data: (data) {
|
data: (data) {
|
||||||
|
|
@ -185,7 +190,8 @@ class _CategoriesTabState extends ConsumerState<CategoriesTab> {
|
||||||
.notifier)
|
.notifier)
|
||||||
.addDeletedCategoryAsync(
|
.addDeletedCategoryAsync(
|
||||||
_entries[
|
_entries[
|
||||||
index], false);
|
index],
|
||||||
|
false);
|
||||||
await isar
|
await isar
|
||||||
.categorys
|
.categorys
|
||||||
.delete(_entries[
|
.delete(_entries[
|
||||||
|
|
@ -279,7 +285,7 @@ class _CategoriesTabState extends ConsumerState<CategoriesTab> {
|
||||||
: () async {
|
: () async {
|
||||||
await isar.writeTxn(() async {
|
await isar.writeTxn(() async {
|
||||||
await isar.categorys.put(Category(
|
await isar.categorys.put(Category(
|
||||||
forManga: widget.isManga,
|
forItemType: widget.itemType,
|
||||||
name: controller.text,
|
name: controller.text,
|
||||||
));
|
));
|
||||||
});
|
});
|
||||||
|
|
|
||||||
|
|
@ -1,17 +1,18 @@
|
||||||
import 'package:isar/isar.dart';
|
import 'package:isar/isar.dart';
|
||||||
import 'package:mangayomi/main.dart';
|
import 'package:mangayomi/main.dart';
|
||||||
import 'package:mangayomi/models/category.dart';
|
import 'package:mangayomi/models/category.dart';
|
||||||
|
import 'package:mangayomi/models/manga.dart';
|
||||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||||
part 'isar_providers.g.dart';
|
part 'isar_providers.g.dart';
|
||||||
|
|
||||||
@riverpod
|
@riverpod
|
||||||
Stream<List<Category>> getMangaCategorieStream(Ref ref,
|
Stream<List<Category>> getMangaCategorieStream(Ref ref,
|
||||||
{required bool isManga}) async* {
|
{required ItemType itemType}) async* {
|
||||||
yield* isar.categorys
|
yield* isar.categorys
|
||||||
.filter()
|
.filter()
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.and()
|
.and()
|
||||||
.forMangaEqualTo(isManga)
|
.forItemTypeEqualTo(itemType)
|
||||||
.watch(fireImmediately: true);
|
.watch(fireImmediately: true);
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -41,10 +41,10 @@ class GetMangaCategorieStreamFamily extends Family<AsyncValue<List<Category>>> {
|
||||||
|
|
||||||
/// See also [getMangaCategorieStream].
|
/// See also [getMangaCategorieStream].
|
||||||
GetMangaCategorieStreamProvider call({
|
GetMangaCategorieStreamProvider call({
|
||||||
required bool isManga,
|
required ItemType itemType,
|
||||||
}) {
|
}) {
|
||||||
return GetMangaCategorieStreamProvider(
|
return GetMangaCategorieStreamProvider(
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -53,7 +53,7 @@ class GetMangaCategorieStreamFamily extends Family<AsyncValue<List<Category>>> {
|
||||||
covariant GetMangaCategorieStreamProvider provider,
|
covariant GetMangaCategorieStreamProvider provider,
|
||||||
) {
|
) {
|
||||||
return call(
|
return call(
|
||||||
isManga: provider.isManga,
|
itemType: provider.itemType,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -77,11 +77,11 @@ class GetMangaCategorieStreamProvider
|
||||||
extends AutoDisposeStreamProvider<List<Category>> {
|
extends AutoDisposeStreamProvider<List<Category>> {
|
||||||
/// See also [getMangaCategorieStream].
|
/// See also [getMangaCategorieStream].
|
||||||
GetMangaCategorieStreamProvider({
|
GetMangaCategorieStreamProvider({
|
||||||
required bool isManga,
|
required ItemType itemType,
|
||||||
}) : this._internal(
|
}) : this._internal(
|
||||||
(ref) => getMangaCategorieStream(
|
(ref) => getMangaCategorieStream(
|
||||||
ref as GetMangaCategorieStreamRef,
|
ref as GetMangaCategorieStreamRef,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
),
|
),
|
||||||
from: getMangaCategorieStreamProvider,
|
from: getMangaCategorieStreamProvider,
|
||||||
name: r'getMangaCategorieStreamProvider',
|
name: r'getMangaCategorieStreamProvider',
|
||||||
|
|
@ -92,7 +92,7 @@ class GetMangaCategorieStreamProvider
|
||||||
dependencies: GetMangaCategorieStreamFamily._dependencies,
|
dependencies: GetMangaCategorieStreamFamily._dependencies,
|
||||||
allTransitiveDependencies:
|
allTransitiveDependencies:
|
||||||
GetMangaCategorieStreamFamily._allTransitiveDependencies,
|
GetMangaCategorieStreamFamily._allTransitiveDependencies,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
);
|
);
|
||||||
|
|
||||||
GetMangaCategorieStreamProvider._internal(
|
GetMangaCategorieStreamProvider._internal(
|
||||||
|
|
@ -102,10 +102,10 @@ class GetMangaCategorieStreamProvider
|
||||||
required super.allTransitiveDependencies,
|
required super.allTransitiveDependencies,
|
||||||
required super.debugGetCreateSourceHash,
|
required super.debugGetCreateSourceHash,
|
||||||
required super.from,
|
required super.from,
|
||||||
required this.isManga,
|
required this.itemType,
|
||||||
}) : super.internal();
|
}) : super.internal();
|
||||||
|
|
||||||
final bool isManga;
|
final ItemType itemType;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Override overrideWith(
|
Override overrideWith(
|
||||||
|
|
@ -120,7 +120,7 @@ class GetMangaCategorieStreamProvider
|
||||||
dependencies: null,
|
dependencies: null,
|
||||||
allTransitiveDependencies: null,
|
allTransitiveDependencies: null,
|
||||||
debugGetCreateSourceHash: null,
|
debugGetCreateSourceHash: null,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
@ -132,13 +132,14 @@ class GetMangaCategorieStreamProvider
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool operator ==(Object other) {
|
bool operator ==(Object other) {
|
||||||
return other is GetMangaCategorieStreamProvider && other.isManga == isManga;
|
return other is GetMangaCategorieStreamProvider &&
|
||||||
|
other.itemType == itemType;
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
int get hashCode {
|
int get hashCode {
|
||||||
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
var hash = _SystemHash.combine(0, runtimeType.hashCode);
|
||||||
hash = _SystemHash.combine(hash, isManga.hashCode);
|
hash = _SystemHash.combine(hash, itemType.hashCode);
|
||||||
|
|
||||||
return _SystemHash.finish(hash);
|
return _SystemHash.finish(hash);
|
||||||
}
|
}
|
||||||
|
|
@ -148,8 +149,8 @@ class GetMangaCategorieStreamProvider
|
||||||
// ignore: unused_element
|
// ignore: unused_element
|
||||||
mixin GetMangaCategorieStreamRef
|
mixin GetMangaCategorieStreamRef
|
||||||
on AutoDisposeStreamProviderRef<List<Category>> {
|
on AutoDisposeStreamProviderRef<List<Category>> {
|
||||||
/// The parameter `isManga` of this provider.
|
/// The parameter `itemType` of this provider.
|
||||||
bool get isManga;
|
ItemType get itemType;
|
||||||
}
|
}
|
||||||
|
|
||||||
class _GetMangaCategorieStreamProviderElement
|
class _GetMangaCategorieStreamProviderElement
|
||||||
|
|
@ -158,7 +159,7 @@ class _GetMangaCategorieStreamProviderElement
|
||||||
_GetMangaCategorieStreamProviderElement(super.provider);
|
_GetMangaCategorieStreamProviderElement(super.provider);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
bool get isManga => (origin as GetMangaCategorieStreamProvider).isManga;
|
ItemType get itemType => (origin as GetMangaCategorieStreamProvider).itemType;
|
||||||
}
|
}
|
||||||
// ignore_for_file: type=lint
|
// 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
|
// 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
|
||||||
|
|
|
||||||
2424
lib/modules/novel/novel_reader_view.dart
Normal file
2424
lib/modules/novel/novel_reader_view.dart
Normal file
File diff suppressed because it is too large
Load diff
|
|
@ -42,7 +42,11 @@ class _UpdatesScreenState extends ConsumerState<UpdatesScreen>
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.favoriteEqualTo(true)
|
.favoriteEqualTo(true)
|
||||||
.and()
|
.and()
|
||||||
.isMangaEqualTo(_tabBarController.index == 0)
|
.itemTypeEqualTo(_tabBarController.index == 0
|
||||||
|
? ItemType.manga
|
||||||
|
: _tabBarController.index == 1
|
||||||
|
? ItemType.anime
|
||||||
|
: ItemType.novel)
|
||||||
.findAllSync();
|
.findAllSync();
|
||||||
int numbers = 0;
|
int numbers = 0;
|
||||||
|
|
||||||
|
|
@ -160,10 +164,14 @@ class _UpdatesScreenState extends ConsumerState<UpdatesScreen>
|
||||||
List<Update> updates = isar.updates
|
List<Update> updates = isar.updates
|
||||||
.filter()
|
.filter()
|
||||||
.idIsNotNull()
|
.idIsNotNull()
|
||||||
.chapter((q) => q.manga((q) =>
|
.chapter((q) => q.manga((q) => q
|
||||||
q.isMangaEqualTo(
|
.itemTypeEqualTo(_tabBarController
|
||||||
_tabBarController.index ==
|
.index ==
|
||||||
0)))
|
0
|
||||||
|
? ItemType.manga
|
||||||
|
: _tabBarController.index == 1
|
||||||
|
? ItemType.anime
|
||||||
|
: ItemType.novel)))
|
||||||
.findAllSync()
|
.findAllSync()
|
||||||
.toList();
|
.toList();
|
||||||
isar.writeTxnSync(() {
|
isar.writeTxnSync(() {
|
||||||
|
|
@ -191,6 +199,7 @@ class _UpdatesScreenState extends ConsumerState<UpdatesScreen>
|
||||||
tabs: [
|
tabs: [
|
||||||
Tab(text: l10n.manga),
|
Tab(text: l10n.manga),
|
||||||
Tab(text: l10n.anime),
|
Tab(text: l10n.anime),
|
||||||
|
Tab(text: l10n.novel),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -198,11 +207,15 @@ class _UpdatesScreenState extends ConsumerState<UpdatesScreen>
|
||||||
padding: const EdgeInsets.only(top: 10),
|
padding: const EdgeInsets.only(top: 10),
|
||||||
child: TabBarView(controller: _tabBarController, children: [
|
child: TabBarView(controller: _tabBarController, children: [
|
||||||
UpdateTab(
|
UpdateTab(
|
||||||
isManga: true,
|
itemType: ItemType.manga,
|
||||||
query: _textEditingController.text,
|
query: _textEditingController.text,
|
||||||
isLoading: _isLoading),
|
isLoading: _isLoading),
|
||||||
UpdateTab(
|
UpdateTab(
|
||||||
isManga: false,
|
itemType: ItemType.anime,
|
||||||
|
query: _textEditingController.text,
|
||||||
|
isLoading: _isLoading),
|
||||||
|
UpdateTab(
|
||||||
|
itemType: ItemType.novel,
|
||||||
query: _textEditingController.text,
|
query: _textEditingController.text,
|
||||||
isLoading: _isLoading)
|
isLoading: _isLoading)
|
||||||
]),
|
]),
|
||||||
|
|
@ -214,10 +227,10 @@ class _UpdatesScreenState extends ConsumerState<UpdatesScreen>
|
||||||
|
|
||||||
class UpdateTab extends ConsumerStatefulWidget {
|
class UpdateTab extends ConsumerStatefulWidget {
|
||||||
final String query;
|
final String query;
|
||||||
final bool isManga;
|
final ItemType itemType;
|
||||||
final bool isLoading;
|
final bool isLoading;
|
||||||
const UpdateTab(
|
const UpdateTab(
|
||||||
{required this.isManga,
|
{required this.itemType,
|
||||||
required this.query,
|
required this.query,
|
||||||
required this.isLoading,
|
required this.isLoading,
|
||||||
super.key});
|
super.key});
|
||||||
|
|
@ -231,7 +244,7 @@ class _UpdateTabState extends ConsumerState<UpdateTab> {
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
final l10n = l10nLocalizations(context)!;
|
final l10n = l10nLocalizations(context)!;
|
||||||
final update =
|
final update =
|
||||||
ref.watch(getAllUpdateStreamProvider(isManga: widget.isManga));
|
ref.watch(getAllUpdateStreamProvider(itemType: widget.itemType));
|
||||||
return Scaffold(
|
return Scaffold(
|
||||||
body: Stack(
|
body: Stack(
|
||||||
children: [
|
children: [
|
||||||
|
|
|
||||||
|
|
@ -19,7 +19,7 @@ import 'package:mangayomi/modules/widgets/cover_view_widget.dart';
|
||||||
|
|
||||||
class MangaImageCardWidget extends ConsumerWidget {
|
class MangaImageCardWidget extends ConsumerWidget {
|
||||||
final Source source;
|
final Source source;
|
||||||
final bool isManga;
|
final ItemType itemType;
|
||||||
final bool isComfortableGrid;
|
final bool isComfortableGrid;
|
||||||
final MManga? getMangaDetail;
|
final MManga? getMangaDetail;
|
||||||
|
|
||||||
|
|
@ -28,7 +28,7 @@ class MangaImageCardWidget extends ConsumerWidget {
|
||||||
super.key,
|
super.key,
|
||||||
required this.getMangaDetail,
|
required this.getMangaDetail,
|
||||||
required this.isComfortableGrid,
|
required this.isComfortableGrid,
|
||||||
required this.isManga});
|
required this.itemType});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context, WidgetRef ref) {
|
Widget build(BuildContext context, WidgetRef ref) {
|
||||||
|
|
@ -68,7 +68,7 @@ class MangaImageCardWidget extends ConsumerWidget {
|
||||||
getManga: getMangaDetail!,
|
getManga: getMangaDetail!,
|
||||||
lang: source.lang!,
|
lang: source.lang!,
|
||||||
source: source.name!,
|
source: source.name!,
|
||||||
isManga: isManga);
|
itemType: itemType);
|
||||||
},
|
},
|
||||||
onLongPress: () {
|
onLongPress: () {
|
||||||
pushToMangaReaderDetail(
|
pushToMangaReaderDetail(
|
||||||
|
|
@ -76,7 +76,7 @@ class MangaImageCardWidget extends ConsumerWidget {
|
||||||
getManga: getMangaDetail!,
|
getManga: getMangaDetail!,
|
||||||
lang: source.lang!,
|
lang: source.lang!,
|
||||||
source: source.name!,
|
source: source.name!,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
addToFavourite: true);
|
addToFavourite: true);
|
||||||
},
|
},
|
||||||
onSecondaryTap: () {
|
onSecondaryTap: () {
|
||||||
|
|
@ -85,7 +85,7 @@ class MangaImageCardWidget extends ConsumerWidget {
|
||||||
getManga: getMangaDetail!,
|
getManga: getMangaDetail!,
|
||||||
lang: source.lang!,
|
lang: source.lang!,
|
||||||
source: source.name!,
|
source: source.name!,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
addToFavourite: true);
|
addToFavourite: true);
|
||||||
},
|
},
|
||||||
children: [
|
children: [
|
||||||
|
|
@ -121,13 +121,13 @@ class MangaImageCardWidget extends ConsumerWidget {
|
||||||
|
|
||||||
class MangaImageCardListTileWidget extends ConsumerWidget {
|
class MangaImageCardListTileWidget extends ConsumerWidget {
|
||||||
final Source source;
|
final Source source;
|
||||||
final bool isManga;
|
final ItemType itemType;
|
||||||
final MManga? getMangaDetail;
|
final MManga? getMangaDetail;
|
||||||
|
|
||||||
const MangaImageCardListTileWidget(
|
const MangaImageCardListTileWidget(
|
||||||
{required this.source,
|
{required this.source,
|
||||||
super.key,
|
super.key,
|
||||||
required this.isManga,
|
required this.itemType,
|
||||||
required this.getMangaDetail});
|
required this.getMangaDetail});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|
@ -166,7 +166,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget {
|
||||||
getManga: getMangaDetail!,
|
getManga: getMangaDetail!,
|
||||||
lang: source.lang!,
|
lang: source.lang!,
|
||||||
source: source.name!,
|
source: source.name!,
|
||||||
isManga: isManga);
|
itemType: itemType);
|
||||||
},
|
},
|
||||||
onLongPress: () {
|
onLongPress: () {
|
||||||
pushToMangaReaderDetail(
|
pushToMangaReaderDetail(
|
||||||
|
|
@ -174,7 +174,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget {
|
||||||
getManga: getMangaDetail!,
|
getManga: getMangaDetail!,
|
||||||
lang: source.lang!,
|
lang: source.lang!,
|
||||||
source: source.name!,
|
source: source.name!,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
addToFavourite: true);
|
addToFavourite: true);
|
||||||
},
|
},
|
||||||
onSecondaryTap: () {
|
onSecondaryTap: () {
|
||||||
|
|
@ -183,7 +183,7 @@ class MangaImageCardListTileWidget extends ConsumerWidget {
|
||||||
getManga: getMangaDetail!,
|
getManga: getMangaDetail!,
|
||||||
lang: source.lang!,
|
lang: source.lang!,
|
||||||
source: source.name!,
|
source: source.name!,
|
||||||
isManga: isManga,
|
itemType: itemType,
|
||||||
addToFavourite: true);
|
addToFavourite: true);
|
||||||
},
|
},
|
||||||
child: Row(
|
child: Row(
|
||||||
|
|
@ -252,7 +252,7 @@ Future<void> pushToMangaReaderDetail(
|
||||||
required String source,
|
required String source,
|
||||||
int? archiveId,
|
int? archiveId,
|
||||||
Manga? mangaM,
|
Manga? mangaM,
|
||||||
bool? isManga,
|
ItemType? itemType,
|
||||||
bool useMaterialRoute = false,
|
bool useMaterialRoute = false,
|
||||||
bool addToFavourite = false}) async {
|
bool addToFavourite = false}) async {
|
||||||
int? mangaId;
|
int? mangaId;
|
||||||
|
|
@ -269,7 +269,7 @@ Future<void> pushToMangaReaderDetail(
|
||||||
source: source,
|
source: source,
|
||||||
lang: lang,
|
lang: lang,
|
||||||
lastUpdate: 0,
|
lastUpdate: 0,
|
||||||
isManga: isManga ?? true,
|
itemType: itemType ?? ItemType.manga,
|
||||||
artist: getManga.artist ?? '');
|
artist: getManga.artist ?? '');
|
||||||
final empty = isar.mangas
|
final empty = isar.mangas
|
||||||
.filter()
|
.filter()
|
||||||
|
|
|
||||||
|
|
@ -83,18 +83,28 @@ class StorageProvider {
|
||||||
String scanlator = chapter.scanlator?.isNotEmpty ?? false
|
String scanlator = chapter.scanlator?.isNotEmpty ?? false
|
||||||
? "${chapter.scanlator!.replaceForbiddenCharacters('_')}_"
|
? "${chapter.scanlator!.replaceForbiddenCharacters('_')}_"
|
||||||
: "";
|
: "";
|
||||||
final isManga = chapter.manga.value!.isManga!;
|
final itemType = chapter.manga.value!.itemType;
|
||||||
|
final itemTypePath = itemType == ItemType.manga
|
||||||
|
? "Manga"
|
||||||
|
: itemType == ItemType.anime
|
||||||
|
? "Anime"
|
||||||
|
: "Novel";
|
||||||
final dir = await getDirectory();
|
final dir = await getDirectory();
|
||||||
return Directory(
|
return Directory(
|
||||||
"${dir!.path}/downloads/${isManga ? "Manga" : "Anime"}/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}/");
|
"${dir!.path}/downloads/$itemTypePath/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/$scanlator${chapter.name!.replaceForbiddenCharacters('_')}/");
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Directory?> getMangaMainDirectory(Chapter chapter) async {
|
Future<Directory?> getMangaMainDirectory(Chapter chapter) async {
|
||||||
final manga = chapter.manga.value!;
|
final manga = chapter.manga.value!;
|
||||||
final isManga = chapter.manga.value!.isManga!;
|
final itemType = chapter.manga.value!.itemType;
|
||||||
|
final itemTypePath = itemType == ItemType.manga
|
||||||
|
? "Manga"
|
||||||
|
: itemType == ItemType.anime
|
||||||
|
? "Anime"
|
||||||
|
: "Novel";
|
||||||
final dir = await getDirectory();
|
final dir = await getDirectory();
|
||||||
return Directory(
|
return Directory(
|
||||||
"${dir!.path}/downloads/${isManga ? "Manga" : "Anime"}/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/");
|
"${dir!.path}/downloads/$itemTypePath/${manga.source} (${manga.lang!.toUpperCase()})/${manga.name!.replaceForbiddenCharacters('_')}/");
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<Directory?> getDatabaseDirectory() async {
|
Future<Directory?> getDatabaseDirectory() async {
|
||||||
|
|
|
||||||
|
|
@ -3,6 +3,7 @@ import 'package:bot_toast/bot_toast.dart';
|
||||||
import 'package:flutter/foundation.dart';
|
import 'package:flutter/foundation.dart';
|
||||||
import 'package:go_router/go_router.dart';
|
import 'package:go_router/go_router.dart';
|
||||||
import 'package:mangayomi/models/chapter.dart';
|
import 'package:mangayomi/models/chapter.dart';
|
||||||
|
import 'package:mangayomi/models/manga.dart';
|
||||||
import 'package:mangayomi/models/source.dart';
|
import 'package:mangayomi/models/source.dart';
|
||||||
import 'package:mangayomi/models/track_preference.dart';
|
import 'package:mangayomi/models/track_preference.dart';
|
||||||
import 'package:mangayomi/modules/anime/anime_player_view.dart';
|
import 'package:mangayomi/modules/anime/anime_player_view.dart';
|
||||||
|
|
@ -10,6 +11,7 @@ import 'package:mangayomi/modules/browse/extension/edit_code.dart';
|
||||||
import 'package:mangayomi/modules/browse/extension/extension_detail.dart';
|
import 'package:mangayomi/modules/browse/extension/extension_detail.dart';
|
||||||
import 'package:mangayomi/modules/browse/extension/widgets/create_extension.dart';
|
import 'package:mangayomi/modules/browse/extension/widgets/create_extension.dart';
|
||||||
import 'package:mangayomi/modules/browse/sources/sources_filter_screen.dart';
|
import 'package:mangayomi/modules/browse/sources/sources_filter_screen.dart';
|
||||||
|
import 'package:mangayomi/modules/novel/novel_reader_view.dart';
|
||||||
import 'package:mangayomi/modules/updates/updates_screen.dart';
|
import 'package:mangayomi/modules/updates/updates_screen.dart';
|
||||||
import 'package:mangayomi/modules/more/backup_and_restore/backup_and_restore.dart';
|
import 'package:mangayomi/modules/more/backup_and_restore/backup_and_restore.dart';
|
||||||
import 'package:mangayomi/modules/more/categories/categories_screen.dart';
|
import 'package:mangayomi/modules/more/categories/categories_screen.dart';
|
||||||
|
|
@ -86,12 +88,12 @@ class RouterNotifier extends ChangeNotifier {
|
||||||
name: "MangaLibrary",
|
name: "MangaLibrary",
|
||||||
path: '/MangaLibrary',
|
path: '/MangaLibrary',
|
||||||
builder: (context, state) => const LibraryScreen(
|
builder: (context, state) => const LibraryScreen(
|
||||||
isManga: true,
|
itemType: ItemType.manga,
|
||||||
),
|
),
|
||||||
pageBuilder: (context, state) => transitionPage(
|
pageBuilder: (context, state) => transitionPage(
|
||||||
key: state.pageKey,
|
key: state.pageKey,
|
||||||
child: const LibraryScreen(
|
child: const LibraryScreen(
|
||||||
isManga: true,
|
itemType: ItemType.manga,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -99,12 +101,25 @@ class RouterNotifier extends ChangeNotifier {
|
||||||
name: "AnimeLibrary",
|
name: "AnimeLibrary",
|
||||||
path: '/AnimeLibrary',
|
path: '/AnimeLibrary',
|
||||||
builder: (context, state) => const LibraryScreen(
|
builder: (context, state) => const LibraryScreen(
|
||||||
isManga: false,
|
itemType: ItemType.anime,
|
||||||
),
|
),
|
||||||
pageBuilder: (context, state) => transitionPage(
|
pageBuilder: (context, state) => transitionPage(
|
||||||
key: state.pageKey,
|
key: state.pageKey,
|
||||||
child: const LibraryScreen(
|
child: const LibraryScreen(
|
||||||
isManga: false,
|
itemType: ItemType.anime,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
GoRoute(
|
||||||
|
name: "NovelLibrary",
|
||||||
|
path: '/NovelLibrary',
|
||||||
|
builder: (context, state) => const LibraryScreen(
|
||||||
|
itemType: ItemType.novel,
|
||||||
|
),
|
||||||
|
pageBuilder: (context, state) => transitionPage(
|
||||||
|
key: state.pageKey,
|
||||||
|
child: const LibraryScreen(
|
||||||
|
itemType: ItemType.novel,
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
|
|
@ -184,8 +199,8 @@ class RouterNotifier extends ChangeNotifier {
|
||||||
));
|
));
|
||||||
}),
|
}),
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: "/mangareaderview",
|
path: "/mangaReaderView",
|
||||||
name: "mangareaderview",
|
name: "mangaReaderView",
|
||||||
builder: (context, state) {
|
builder: (context, state) {
|
||||||
final chapter = state.extra as Chapter;
|
final chapter = state.extra as Chapter;
|
||||||
return MangaReaderView(
|
return MangaReaderView(
|
||||||
|
|
@ -221,6 +236,25 @@ class RouterNotifier extends ChangeNotifier {
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
),
|
),
|
||||||
|
/*GoRoute(
|
||||||
|
path: "/novelReaderView",
|
||||||
|
name: "novelReaderView",
|
||||||
|
builder: (context, state) {
|
||||||
|
final chapter = state.extra as Chapter;
|
||||||
|
return NovelReaderView(
|
||||||
|
chapter: chapter,
|
||||||
|
);
|
||||||
|
},
|
||||||
|
pageBuilder: (context, state) {
|
||||||
|
final chapter = state.extra as Chapter;
|
||||||
|
return transitionPage(
|
||||||
|
key: state.pageKey,
|
||||||
|
child: NovelReaderView(
|
||||||
|
chapter: chapter,
|
||||||
|
),
|
||||||
|
);
|
||||||
|
},
|
||||||
|
),*/
|
||||||
GoRoute(
|
GoRoute(
|
||||||
path: "/ExtensionLang",
|
path: "/ExtensionLang",
|
||||||
name: "ExtensionLang",
|
name: "ExtensionLang",
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ part of 'aniskip.dart';
|
||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$aniSkipHash() => r'2e5d19b025a2207ff64da7bf7908450ea9e5ff8c';
|
String _$aniSkipHash() => r'887869b54e2e151633efd46da83bde845e14f421';
|
||||||
|
|
||||||
/// See also [AniSkip].
|
/// See also [AniSkip].
|
||||||
@ProviderFor(AniSkip)
|
@ProviderFor(AniSkip)
|
||||||
|
|
|
||||||
|
|
@ -6,7 +6,7 @@ part of 'anilist.dart';
|
||||||
// RiverpodGenerator
|
// RiverpodGenerator
|
||||||
// **************************************************************************
|
// **************************************************************************
|
||||||
|
|
||||||
String _$anilistHash() => r'd3a8852d689b13c3bde46ec05b464e7779149e58';
|
String _$anilistHash() => r'87784b25bccf5b1c61d6c7494f0569a28494dd8b';
|
||||||
|
|
||||||
/// Copied from Dart SDK
|
/// Copied from Dart SDK
|
||||||
class _SystemHash {
|
class _SystemHash {
|
||||||
|
|
|
||||||
Loading…
Reference in a new issue