mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-04-20 23:22:07 +00:00
Add autocroll page , code refactor
This commit is contained in:
parent
a2224fc632
commit
0c9de22c94
24 changed files with 1456 additions and 1062 deletions
|
|
@ -267,6 +267,7 @@
|
|||
"backups":"Backups",
|
||||
"by_scanlator":"By scanlator",
|
||||
"by_name":"By name",
|
||||
"installed":"Installed"
|
||||
"installed":"Installed",
|
||||
"auto_scroll":"Auto scroll"
|
||||
|
||||
}
|
||||
|
|
@ -267,5 +267,6 @@
|
|||
"backups":"Sauvegardes",
|
||||
"by_scanlator":"Par traducteur",
|
||||
"by_name":"Par nom",
|
||||
"installed":"Installé"
|
||||
"installed":"Installé",
|
||||
"auto_scroll":"Défilement automatique"
|
||||
}
|
||||
|
|
@ -18,12 +18,6 @@ class Category {
|
|||
forManga = json['forManga'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['id'] = id;
|
||||
data['name'] = name;
|
||||
data['forManga'] = forManga;
|
||||
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() =>
|
||||
{'id': id, 'name': name, 'forManga': forManga};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -53,18 +53,16 @@ class Chapter {
|
|||
url = json['url'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['archivePath'] = archivePath;
|
||||
data['dateUpload'] = dateUpload;
|
||||
data['id'] = id;
|
||||
data['isBookmarked'] = isBookmarked;
|
||||
data['isRead'] = isRead;
|
||||
data['lastPageRead'] = lastPageRead;
|
||||
data['mangaId'] = mangaId;
|
||||
data['name'] = name;
|
||||
data['scanlator'] = scanlator;
|
||||
data['url'] = url;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() => {
|
||||
'archivePath': archivePath,
|
||||
'dateUpload': dateUpload,
|
||||
'id': id,
|
||||
'isBookmarked': isBookmarked,
|
||||
'isRead': isRead,
|
||||
'lastPageRead': lastPageRead,
|
||||
'mangaId': mangaId,
|
||||
'name': name,
|
||||
'scanlator': scanlator,
|
||||
'url': url
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -49,17 +49,15 @@ class Download {
|
|||
total = json['total'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['chapterId'] = chapterId;
|
||||
data['failed'] = failed;
|
||||
data['id'] = id;
|
||||
data['isDownload'] = isDownload;
|
||||
data['isStartDownload'] = isStartDownload;
|
||||
data['mangaId'] = mangaId;
|
||||
data['succeeded'] = succeeded;
|
||||
data['taskIds'] = taskIds;
|
||||
data['total'] = total;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() => {
|
||||
'chapterId': chapterId,
|
||||
'failed': failed,
|
||||
'id': id,
|
||||
'isDownload': isDownload,
|
||||
'isStartDownload': isStartDownload,
|
||||
'mangaId': mangaId,
|
||||
'succeeded': succeeded,
|
||||
'taskIds': taskIds,
|
||||
'total': total
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -33,13 +33,11 @@ class History {
|
|||
mangaId = json['mangaId'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['chapterId'] = chapterId;
|
||||
data['date'] = date;
|
||||
data['id'] = id;
|
||||
data['isManga'] = isManga;
|
||||
data['mangaId'] = mangaId;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() => {
|
||||
'chapterId': chapterId,
|
||||
'date': date,
|
||||
'id': id,
|
||||
'isManga': isManga,
|
||||
'mangaId': mangaId
|
||||
};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,28 +86,26 @@ class Manga {
|
|||
status = Status.values[json['status']];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['author'] = author;
|
||||
data['categories'] = categories;
|
||||
data['customCoverImage'] = customCoverImage;
|
||||
data['dateAdded'] = dateAdded;
|
||||
data['description'] = description;
|
||||
data['favorite'] = favorite;
|
||||
data['genre'] = genre;
|
||||
data['id'] = id;
|
||||
data['imageUrl'] = imageUrl;
|
||||
data['isLocalArchive'] = isLocalArchive;
|
||||
data['isManga'] = isManga;
|
||||
data['lang'] = lang;
|
||||
data['lastRead'] = lastRead;
|
||||
data['lastUpdate'] = lastUpdate;
|
||||
data['link'] = link;
|
||||
data['name'] = name;
|
||||
data['source'] = source;
|
||||
data['status'] = status.index;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() => {
|
||||
'author': author,
|
||||
'categories': categories,
|
||||
'customCoverImage': customCoverImage,
|
||||
'dateAdded': dateAdded,
|
||||
'description': description,
|
||||
'favorite': favorite,
|
||||
'genre': genre,
|
||||
'id': id,
|
||||
'imageUrl': imageUrl,
|
||||
'isLocalArchive': isLocalArchive,
|
||||
'isManga': isManga,
|
||||
'lang': lang,
|
||||
'lastRead': lastRead,
|
||||
'lastUpdate': lastUpdate,
|
||||
'link': link,
|
||||
'name': name,
|
||||
'source': source,
|
||||
'status': status.index
|
||||
};
|
||||
}
|
||||
|
||||
enum Status {
|
||||
|
|
|
|||
|
|
@ -141,6 +141,8 @@ class Settings {
|
|||
|
||||
bool? usePageTapZones;
|
||||
|
||||
List<AutoScrollPages>? autoScrollPages;
|
||||
|
||||
Settings(
|
||||
{this.id = 227,
|
||||
this.displayType = DisplayType.compactGrid,
|
||||
|
|
@ -316,104 +318,89 @@ class Settings {
|
|||
usePageTapZones = json['usePageTapZones'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['animatePageTransitions'] = animatePageTransitions;
|
||||
data['animeDisplayType'] = animeDisplayType.index;
|
||||
data['animeLibraryDownloadedChapters'] = animeLibraryDownloadedChapters;
|
||||
data['animeLibraryLocalSource'] = animeLibraryLocalSource;
|
||||
data['animeLibraryShowCategoryTabs'] = animeLibraryShowCategoryTabs;
|
||||
data['animeLibraryShowContinueReadingButton'] =
|
||||
animeLibraryShowContinueReadingButton;
|
||||
data['animeLibraryShowLanguage'] = animeLibraryShowLanguage;
|
||||
data['animeLibraryShowNumbersOfItems'] = animeLibraryShowNumbersOfItems;
|
||||
data['autoExtensionsUpdates'] = autoExtensionsUpdates;
|
||||
data['backgroundColor'] = backgroundColor.index;
|
||||
if (chapterFilterBookmarkedList != null) {
|
||||
data['chapterFilterBookmarkedList'] =
|
||||
chapterFilterBookmarkedList!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
if (chapterFilterDownloadedList != null) {
|
||||
data['chapterFilterDownloadedList'] =
|
||||
chapterFilterDownloadedList!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
if (chapterFilterUnreadList != null) {
|
||||
data['chapterFilterUnreadList'] =
|
||||
chapterFilterUnreadList!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
if (chapterPageIndexList != null) {
|
||||
data['chapterPageIndexList'] =
|
||||
chapterPageIndexList!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
if (chapterPageUrlsList != null) {
|
||||
data['chapterPageUrlsList'] =
|
||||
chapterPageUrlsList!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
data['checkForExtensionUpdates'] = checkForExtensionUpdates;
|
||||
data['cookiesList'] = cookiesList;
|
||||
data['cropBorders'] = cropBorders;
|
||||
data['dateFormat'] = dateFormat;
|
||||
data['defaultReaderMode'] = defaultReaderMode.index;
|
||||
data['displayType'] = displayType.index;
|
||||
data['doubleTapAnimationSpeed'] = doubleTapAnimationSpeed;
|
||||
data['downloadLocation'] = downloadLocation;
|
||||
data['downloadOnlyOnWifi'] = downloadOnlyOnWifi;
|
||||
data['filterScanlatorList'] = filterScanlatorList;
|
||||
data['flexColorSchemeBlendLevel'] = flexColorSchemeBlendLevel;
|
||||
data['flexSchemeColorIndex'] = flexSchemeColorIndex;
|
||||
data['id'] = id;
|
||||
data['incognitoMode'] = incognitoMode;
|
||||
data['libraryDownloadedChapters'] = libraryDownloadedChapters;
|
||||
data['libraryFilterAnimeBookMarkedType'] = libraryFilterAnimeBookMarkedType;
|
||||
data['libraryFilterAnimeDownloadType'] = libraryFilterAnimeDownloadType;
|
||||
data['libraryFilterAnimeStartedType'] = libraryFilterAnimeStartedType;
|
||||
data['libraryFilterAnimeUnreadType'] = libraryFilterAnimeUnreadType;
|
||||
data['libraryFilterMangasBookMarkedType'] =
|
||||
libraryFilterMangasBookMarkedType;
|
||||
data['libraryFilterMangasDownloadType'] = libraryFilterMangasDownloadType;
|
||||
data['libraryFilterMangasStartedType'] = libraryFilterMangasStartedType;
|
||||
data['libraryFilterMangasUnreadType'] = libraryFilterMangasUnreadType;
|
||||
data['libraryLocalSource'] = libraryLocalSource;
|
||||
data['libraryShowCategoryTabs'] = libraryShowCategoryTabs;
|
||||
data['libraryShowContinueReadingButton'] = libraryShowContinueReadingButton;
|
||||
data['libraryShowLanguage'] = libraryShowLanguage;
|
||||
data['libraryShowNumbersOfItems'] = libraryShowNumbersOfItems;
|
||||
if (locale != null) {
|
||||
data['locale'] = locale!.toJson();
|
||||
}
|
||||
data['onlyIncludePinnedSources'] = onlyIncludePinnedSources;
|
||||
data['pagePreloadAmount'] = pagePreloadAmount;
|
||||
if (personalPageModeList != null) {
|
||||
data['personalPageModeList'] =
|
||||
personalPageModeList!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
if (personalReaderModeList != null) {
|
||||
data['personalReaderModeList'] =
|
||||
personalReaderModeList!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
data['pureBlackDarkMode'] = pureBlackDarkMode;
|
||||
data['relativeTimesTamps'] = relativeTimesTamps;
|
||||
data['saveAsCBZArchive'] = saveAsCBZArchive;
|
||||
data['scaleType'] = scaleType.index;
|
||||
data['showNSFW'] = showNSFW;
|
||||
data['showPagesNumber'] = showPagesNumber;
|
||||
if (sortChapterList != null) {
|
||||
data['sortChapterList'] =
|
||||
sortChapterList!.map((v) => v.toJson()).toList();
|
||||
}
|
||||
data['sortLibraryAnime'] = sortLibraryAnime;
|
||||
if (sortLibraryManga != null) {
|
||||
data['sortLibraryManga'] = sortLibraryManga!.toJson();
|
||||
}
|
||||
data['themeIsDark'] = themeIsDark;
|
||||
data['userAgent'] = userAgent;
|
||||
data['backupFrequency'] = backupFrequency;
|
||||
data['backupFrequencyOptions'] = backupFrequencyOptions;
|
||||
data['autoBackupLocation'] = autoBackupLocation;
|
||||
data['startDatebackup'] = startDatebackup;
|
||||
data['usePageTapZones'] = usePageTapZones;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() => {
|
||||
'animatePageTransitions': animatePageTransitions,
|
||||
'animeDisplayType': animeDisplayType.index,
|
||||
'animeLibraryDownloadedChapters': animeLibraryDownloadedChapters,
|
||||
'animeLibraryLocalSource': animeLibraryLocalSource,
|
||||
'animeLibraryShowCategoryTabs': animeLibraryShowCategoryTabs,
|
||||
'animeLibraryShowContinueReadingButton':
|
||||
animeLibraryShowContinueReadingButton,
|
||||
'animeLibraryShowLanguage': animeLibraryShowLanguage,
|
||||
'animeLibraryShowNumbersOfItems': animeLibraryShowNumbersOfItems,
|
||||
'autoExtensionsUpdates': autoExtensionsUpdates,
|
||||
'backgroundColor': backgroundColor.index,
|
||||
if (chapterFilterBookmarkedList != null)
|
||||
'chapterFilterBookmarkedList':
|
||||
chapterFilterBookmarkedList!.map((v) => v.toJson()).toList(),
|
||||
if (chapterFilterDownloadedList != null)
|
||||
'chapterFilterDownloadedList':
|
||||
chapterFilterDownloadedList!.map((v) => v.toJson()).toList(),
|
||||
if (chapterFilterUnreadList != null)
|
||||
'chapterFilterUnreadList':
|
||||
chapterFilterUnreadList!.map((v) => v.toJson()).toList(),
|
||||
if (chapterPageIndexList != null)
|
||||
'chapterPageIndexList':
|
||||
chapterPageIndexList!.map((v) => v.toJson()).toList(),
|
||||
if (chapterPageUrlsList != null)
|
||||
'chapterPageUrlsList':
|
||||
chapterPageUrlsList!.map((v) => v.toJson()).toList(),
|
||||
'checkForExtensionUpdates': checkForExtensionUpdates,
|
||||
'cookiesList': cookiesList,
|
||||
'cropBorders': cropBorders,
|
||||
'dateFormat': dateFormat,
|
||||
'defaultReaderMode': defaultReaderMode.index,
|
||||
'displayType': displayType.index,
|
||||
'doubleTapAnimationSpeed': doubleTapAnimationSpeed,
|
||||
'downloadLocation': downloadLocation,
|
||||
'downloadOnlyOnWifi': downloadOnlyOnWifi,
|
||||
'filterScanlatorList': filterScanlatorList,
|
||||
'flexColorSchemeBlendLevel': flexColorSchemeBlendLevel,
|
||||
'flexSchemeColorIndex': flexSchemeColorIndex,
|
||||
'id': id,
|
||||
'incognitoMode': incognitoMode,
|
||||
'libraryDownloadedChapters': libraryDownloadedChapters,
|
||||
'libraryFilterAnimeBookMarkedType': libraryFilterAnimeBookMarkedType,
|
||||
'libraryFilterAnimeDownloadType': libraryFilterAnimeDownloadType,
|
||||
'libraryFilterAnimeStartedType': libraryFilterAnimeStartedType,
|
||||
'libraryFilterAnimeUnreadType': libraryFilterAnimeUnreadType,
|
||||
'libraryFilterMangasBookMarkedType': libraryFilterMangasBookMarkedType,
|
||||
'libraryFilterMangasDownloadType': libraryFilterMangasDownloadType,
|
||||
'libraryFilterMangasStartedType': libraryFilterMangasStartedType,
|
||||
'libraryFilterMangasUnreadType': libraryFilterMangasUnreadType,
|
||||
'libraryLocalSource': libraryLocalSource,
|
||||
'libraryShowCategoryTabs': libraryShowCategoryTabs,
|
||||
'libraryShowContinueReadingButton': libraryShowContinueReadingButton,
|
||||
'libraryShowLanguage': libraryShowLanguage,
|
||||
'libraryShowNumbersOfItems': libraryShowNumbersOfItems,
|
||||
if (locale != null) 'locale': locale!.toJson(),
|
||||
'onlyIncludePinnedSources': onlyIncludePinnedSources,
|
||||
'pagePreloadAmount': pagePreloadAmount,
|
||||
if (personalPageModeList != null)
|
||||
'personalPageModeList':
|
||||
personalPageModeList!.map((v) => v.toJson()).toList(),
|
||||
if (personalReaderModeList != null)
|
||||
'personalReaderModeList':
|
||||
personalReaderModeList!.map((v) => v.toJson()).toList(),
|
||||
'pureBlackDarkMode': pureBlackDarkMode,
|
||||
'relativeTimesTamps': relativeTimesTamps,
|
||||
'saveAsCBZArchive': saveAsCBZArchive,
|
||||
'scaleType': scaleType.index,
|
||||
'showNSFW': showNSFW,
|
||||
'showPagesNumber': showPagesNumber,
|
||||
if (sortChapterList != null)
|
||||
'sortChapterList': sortChapterList!.map((v) => v.toJson()).toList(),
|
||||
'sortLibraryAnime': sortLibraryAnime,
|
||||
if (sortLibraryManga != null)
|
||||
'sortLibraryManga': sortLibraryManga!.toJson(),
|
||||
'themeIsDark': themeIsDark,
|
||||
'userAgent': userAgent,
|
||||
'backupFrequency': backupFrequency,
|
||||
'backupFrequencyOptions': backupFrequencyOptions,
|
||||
'autoBackupLocation': autoBackupLocation,
|
||||
'startDatebackup': startDatebackup,
|
||||
'usePageTapZones': usePageTapZones
|
||||
};
|
||||
}
|
||||
|
||||
enum DisplayType {
|
||||
|
|
@ -444,12 +431,7 @@ class SortLibraryManga {
|
|||
reverse = json['reverse'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['index'] = index;
|
||||
data['reverse'] = reverse;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() => {'index': index, 'reverse': reverse};
|
||||
}
|
||||
|
||||
@embedded
|
||||
|
|
@ -464,13 +446,8 @@ class SortChapter {
|
|||
reverse = json['reverse'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['index'] = index;
|
||||
data['mangaId'] = mangaId;
|
||||
data['reverse'] = reverse;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() =>
|
||||
{'index': index, 'mangaId': mangaId, 'reverse': reverse};
|
||||
}
|
||||
|
||||
@embedded
|
||||
|
|
@ -483,12 +460,7 @@ class ChapterFilterDownloaded {
|
|||
type = json['type'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['mangaId'] = mangaId;
|
||||
data['type'] = type;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() => {'mangaId': mangaId, 'type': type};
|
||||
}
|
||||
|
||||
@embedded
|
||||
|
|
@ -501,12 +473,7 @@ class ChapterFilterUnread {
|
|||
type = json['type'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['mangaId'] = mangaId;
|
||||
data['type'] = type;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() => {'mangaId': mangaId, 'type': type};
|
||||
}
|
||||
|
||||
@embedded
|
||||
|
|
@ -519,12 +486,7 @@ class ChapterFilterBookmarked {
|
|||
type = json['type'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['mangaId'] = mangaId;
|
||||
data['type'] = type;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() => {'mangaId': mangaId, 'type': type};
|
||||
}
|
||||
|
||||
@embedded
|
||||
|
|
@ -538,12 +500,7 @@ class ChapterPageurls {
|
|||
urls = json['urls']?.cast<String>();
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['chapterId'] = chapterId;
|
||||
data['urls'] = urls;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() => {'chapterId': chapterId, 'urls': urls};
|
||||
}
|
||||
|
||||
@embedded
|
||||
|
|
@ -557,12 +514,7 @@ class ChapterPageIndex {
|
|||
index = json['index'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['chapterId'] = chapterId;
|
||||
data['index'] = index;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() => {'chapterId': chapterId, 'index': index};
|
||||
}
|
||||
|
||||
@embedded
|
||||
|
|
@ -576,12 +528,7 @@ class Cookie {
|
|||
cookie = json['cookie'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['idSource'] = idSource;
|
||||
data['cookie'] = cookie;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() => {'idSource': idSource, 'cookie': cookie};
|
||||
}
|
||||
|
||||
@embedded
|
||||
|
|
@ -597,12 +544,26 @@ class PersonalReaderMode {
|
|||
readerMode = ReaderMode.values[json['readerMode']];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['mangaId'] = mangaId;
|
||||
data['readerMode'] = readerMode.index;
|
||||
return data;
|
||||
Map<String, dynamic> toJson() =>
|
||||
{'mangaId': mangaId, 'readerMode': readerMode.index};
|
||||
}
|
||||
|
||||
@embedded
|
||||
class AutoScrollPages {
|
||||
int? mangaId;
|
||||
double? pageOffset;
|
||||
bool? autoScroll;
|
||||
AutoScrollPages(
|
||||
{this.mangaId, this.pageOffset = 10, this.autoScroll = false});
|
||||
|
||||
AutoScrollPages.fromJson(Map<String, dynamic> json) {
|
||||
mangaId = json['mangaId'];
|
||||
pageOffset = json['pageOffset'];
|
||||
autoScroll = json['autoScroll'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() =>
|
||||
{'mangaId': mangaId, 'pageOffset': pageOffset, 'autoScroll': autoScroll};
|
||||
}
|
||||
|
||||
@embedded
|
||||
|
|
@ -618,17 +579,13 @@ class PersonalPageMode {
|
|||
pageMode = PageMode.values[json['pageMode']];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['mangaId'] = mangaId;
|
||||
data['pageMode'] = pageMode.index;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() =>
|
||||
{'mangaId': mangaId, 'pageMode': pageMode.index};
|
||||
}
|
||||
|
||||
enum ReaderMode { vertical, ltr, rtl, verticalContinuous, webtoon }
|
||||
|
||||
enum PageMode { onePage, doubleColumm }
|
||||
enum PageMode { onePage, doublePage }
|
||||
|
||||
@embedded
|
||||
class FilterScanlator {
|
||||
|
|
@ -641,12 +598,8 @@ class FilterScanlator {
|
|||
scanlators = json['scanlators']?.cast<String>();
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['mangaId'] = mangaId;
|
||||
data['scanlators'] = scanlators;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() =>
|
||||
{'mangaId': mangaId, 'scanlators': scanlators};
|
||||
}
|
||||
|
||||
@embedded
|
||||
|
|
@ -660,10 +613,6 @@ class L10nLocale {
|
|||
languageCode = json['languageCode'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['countryCode'] = countryCode;
|
||||
data['languageCode'] = languageCode;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() =>
|
||||
{'countryCode': countryCode, 'languageCode': languageCode};
|
||||
}
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -106,34 +106,32 @@ class Source {
|
|||
additionalParams = json['additionalParams'] ?? "";
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['apiUrl'] = apiUrl;
|
||||
data['appMinVerReq'] = appMinVerReq;
|
||||
data['baseUrl'] = baseUrl;
|
||||
data['dateFormat'] = dateFormat;
|
||||
data['dateFormatLocale'] = dateFormatLocale;
|
||||
data['hasCloudflare'] = hasCloudflare;
|
||||
data['headers'] = headers;
|
||||
data['iconUrl'] = iconUrl;
|
||||
data['id'] = id;
|
||||
data['isActive'] = isActive;
|
||||
data['isAdded'] = isAdded;
|
||||
data['isFullData'] = isFullData;
|
||||
data['isManga'] = isManga;
|
||||
data['isNsfw'] = isNsfw;
|
||||
data['isPinned'] = isPinned;
|
||||
data['lang'] = lang;
|
||||
data['lastUsed'] = lastUsed;
|
||||
data['name'] = name;
|
||||
data['sourceCode'] = sourceCode;
|
||||
data['sourceCodeUrl'] = sourceCodeUrl;
|
||||
data['typeSource'] = typeSource;
|
||||
data['version'] = version;
|
||||
data['versionLast'] = versionLast;
|
||||
data['additionalParams'] = additionalParams;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() => {
|
||||
'apiUrl': apiUrl,
|
||||
'appMinVerReq': appMinVerReq,
|
||||
'baseUrl': baseUrl,
|
||||
'dateFormat': dateFormat,
|
||||
'dateFormatLocale': dateFormatLocale,
|
||||
'hasCloudflare': hasCloudflare,
|
||||
'headers': headers,
|
||||
'iconUrl': iconUrl,
|
||||
'id': id,
|
||||
'isActive': isActive,
|
||||
'isAdded': isAdded,
|
||||
'isFullData': isFullData,
|
||||
'isManga': isManga,
|
||||
'isNsfw': isNsfw,
|
||||
'isPinned': isPinned,
|
||||
'lang': lang,
|
||||
'lastUsed': lastUsed,
|
||||
'name': name,
|
||||
'sourceCode': sourceCode,
|
||||
'sourceCodeUrl': sourceCodeUrl,
|
||||
'typeSource': typeSource,
|
||||
'version': version,
|
||||
'versionLast': versionLast,
|
||||
'additionalParams': additionalParams,
|
||||
};
|
||||
|
||||
MSource toMSource() {
|
||||
return MSource(
|
||||
|
|
|
|||
|
|
@ -65,24 +65,22 @@ class Track {
|
|||
isManga = json['isManga'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['finishedReadingDate'] = finishedReadingDate;
|
||||
data['id'] = id;
|
||||
data['lastChapterRead'] = lastChapterRead;
|
||||
data['libraryId'] = libraryId;
|
||||
data['mangaId'] = mangaId;
|
||||
data['mediaId'] = mediaId;
|
||||
data['score'] = score;
|
||||
data['startedReadingDate'] = startedReadingDate;
|
||||
data['status'] = status.index;
|
||||
data['syncId'] = syncId;
|
||||
data['title'] = title;
|
||||
data['totalChapter'] = totalChapter;
|
||||
data['trackingUrl'] = trackingUrl;
|
||||
data['isManga'] = isManga;
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() => {
|
||||
'finishedReadingDate': finishedReadingDate,
|
||||
'id': id,
|
||||
'lastChapterRead': lastChapterRead,
|
||||
'libraryId': libraryId,
|
||||
'mangaId': mangaId,
|
||||
'mediaId': mediaId,
|
||||
'score': score,
|
||||
'startedReadingDate': startedReadingDate,
|
||||
'status': status.index,
|
||||
'syncId': syncId,
|
||||
'title': title,
|
||||
'totalChapter': totalChapter,
|
||||
'trackingUrl': trackingUrl,
|
||||
'isManga': isManga,
|
||||
};
|
||||
}
|
||||
|
||||
enum TrackStatus {
|
||||
|
|
|
|||
|
|
@ -26,13 +26,6 @@ class TrackPreference {
|
|||
prefs = json['prefs'];
|
||||
}
|
||||
|
||||
Map<String, dynamic> toJson() {
|
||||
final Map<String, dynamic> data = <String, dynamic>{};
|
||||
data['syncId'] = syncId;
|
||||
data['username'] = username;
|
||||
data['oAuth'] = oAuth;
|
||||
data['prefs'] = prefs;
|
||||
|
||||
return data;
|
||||
}
|
||||
Map<String, dynamic> toJson() =>
|
||||
{'syncId': syncId, 'username': username, 'oAuth': oAuth, 'prefs': prefs};
|
||||
}
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ part of 'fetch_anime_sources.dart';
|
|||
// **************************************************************************
|
||||
|
||||
String _$fetchAnimeSourcesListHash() =>
|
||||
r'f249fc2761491c8109bdd253d1ec434177f29b21';
|
||||
r'3f9cf47efce8e6e207c59e0d936727959c1fe982';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ part of 'fetch_manga_sources.dart';
|
|||
// **************************************************************************
|
||||
|
||||
String _$fetchMangaSourcesListHash() =>
|
||||
r'4830433a410607ed401c6c004af2377c0262a733';
|
||||
r'a74557098c49877942a296abe110fb6ef1dce580';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -62,6 +62,34 @@ class ReaderController {
|
|||
return isar.settings.getSync(227)!.defaultReaderMode;
|
||||
}
|
||||
|
||||
(bool, double) isAutoValues() {
|
||||
final autoScrollPagesList = getIsarSetting().autoScrollPages ?? [];
|
||||
final autoScrollPages = autoScrollPagesList
|
||||
.where((element) => element.mangaId == getManga().id);
|
||||
if (autoScrollPages.isNotEmpty) {
|
||||
return (
|
||||
autoScrollPages.first.autoScroll ?? false,
|
||||
autoScrollPages.first.pageOffset ?? 10
|
||||
);
|
||||
}
|
||||
return (false, 10);
|
||||
}
|
||||
|
||||
void setAutoScroll(bool value, double offset) {
|
||||
List<AutoScrollPages>? autoScrollPagesList = [];
|
||||
for (var autoScrollPages in getIsarSetting().autoScrollPages ?? []) {
|
||||
if (autoScrollPages.mangaId != getManga().id) {
|
||||
autoScrollPagesList.add(autoScrollPages);
|
||||
}
|
||||
}
|
||||
autoScrollPagesList.add(AutoScrollPages()
|
||||
..mangaId = getManga().id
|
||||
..pageOffset = offset
|
||||
..autoScroll = value);
|
||||
isar.writeTxnSync(() => isar.settings
|
||||
.putSync(getIsarSetting()..autoScrollPages = autoScrollPagesList));
|
||||
}
|
||||
|
||||
PageMode getPageMode() {
|
||||
final personalPageModeList = getIsarSetting().personalPageModeList ?? [];
|
||||
final personalPageMode = personalPageModeList
|
||||
|
|
|
|||
File diff suppressed because it is too large
Load diff
|
|
@ -1,4 +1,3 @@
|
|||
import 'dart:io';
|
||||
import 'package:file_picker/file_picker.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
|
|
@ -9,16 +8,13 @@ import 'package:mangayomi/modules/more/backup_and_restore/providers/backup.dart'
|
|||
import 'package:mangayomi/modules/more/backup_and_restore/providers/restore.dart';
|
||||
import 'package:mangayomi/providers/l10n_providers.dart';
|
||||
import 'package:mangayomi/utils/colors.dart';
|
||||
import 'package:mangayomi/utils/extensions.dart';
|
||||
import 'package:mangayomi/utils/media_query.dart';
|
||||
import 'package:share_plus/share_plus.dart';
|
||||
|
||||
class BackupAndRestore extends ConsumerWidget {
|
||||
const BackupAndRestore({super.key});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
// final isIOS = Platform.isIOS;
|
||||
final backupFrequency = ref.watch(backupFrequencyStateProvider);
|
||||
final backupFrequencyOptions =
|
||||
ref.watch(backupFrequencyOptionsStateProvider);
|
||||
|
|
@ -81,22 +77,14 @@ class BackupAndRestore extends ConsumerWidget {
|
|||
)),
|
||||
TextButton(
|
||||
onPressed: () async {
|
||||
// if (isIOS) {
|
||||
// ref.watch(doBackUpProvider(
|
||||
// list: indexList,
|
||||
// path: autoBackupLocation.$1,
|
||||
// context: context));
|
||||
// } else {
|
||||
final result = await FilePicker.platform
|
||||
.getDirectoryPath();
|
||||
|
||||
final result = await FilePicker.platform
|
||||
.getDirectoryPath();
|
||||
|
||||
if (result != null && context.mounted) {
|
||||
ref.watch(doBackUpProvider(
|
||||
list: indexList,
|
||||
path: result,
|
||||
context: context));
|
||||
// }
|
||||
if (result != null && context.mounted) {
|
||||
ref.watch(doBackUpProvider(
|
||||
list: indexList,
|
||||
path: result,
|
||||
context: context));
|
||||
}
|
||||
},
|
||||
child: Text(
|
||||
|
|
@ -260,24 +248,22 @@ class BackupAndRestore extends ConsumerWidget {
|
|||
),
|
||||
),
|
||||
// if (!isIOS)
|
||||
ListTile(
|
||||
onTap: () async {
|
||||
String? result = await FilePicker.platform.getDirectoryPath();
|
||||
ListTile(
|
||||
onTap: () async {
|
||||
String? result = await FilePicker.platform.getDirectoryPath();
|
||||
|
||||
if (result != null) {
|
||||
ref
|
||||
.read(autoBackupLocationStateProvider.notifier)
|
||||
.set(result);
|
||||
}
|
||||
},
|
||||
title: Text(l10n.backup_location),
|
||||
subtitle: Text(
|
||||
autoBackupLocation.$2.isEmpty
|
||||
? autoBackupLocation.$1
|
||||
: autoBackupLocation.$2,
|
||||
style: TextStyle(fontSize: 11, color: secondaryColor(context)),
|
||||
),
|
||||
if (result != null) {
|
||||
ref.read(autoBackupLocationStateProvider.notifier).set(result);
|
||||
}
|
||||
},
|
||||
title: Text(l10n.backup_location),
|
||||
subtitle: Text(
|
||||
autoBackupLocation.$2.isEmpty
|
||||
? autoBackupLocation.$1
|
||||
: autoBackupLocation.$2,
|
||||
style: TextStyle(fontSize: 11, color: secondaryColor(context)),
|
||||
),
|
||||
),
|
||||
ListTile(
|
||||
onTap: () {
|
||||
final list = _getList(context);
|
||||
|
|
@ -355,8 +341,6 @@ class BackupAndRestore extends ConsumerWidget {
|
|||
style: TextStyle(fontSize: 11, color: secondaryColor(context)),
|
||||
),
|
||||
),
|
||||
// if (isIOS)
|
||||
// ListBackupFilesFromDirectory(directory: autoBackupLocation.$1),
|
||||
ListTile(
|
||||
title: Padding(
|
||||
padding: const EdgeInsets.only(bottom: 8),
|
||||
|
|
@ -400,67 +384,3 @@ List<String> _getBackupFrequencyList(BuildContext context) {
|
|||
l10n.weekly
|
||||
];
|
||||
}
|
||||
|
||||
class ListBackupFilesFromDirectory extends ConsumerWidget {
|
||||
final String directory;
|
||||
const ListBackupFilesFromDirectory({super.key, required this.directory});
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context, WidgetRef ref) {
|
||||
final files = Directory(directory)
|
||||
.listSync()
|
||||
.where((element) =>
|
||||
element.path.contains('mangayomi_') &&
|
||||
element.path.endsWith('.backup'))
|
||||
.toList()
|
||||
.reversed
|
||||
.toList();
|
||||
return files.isNotEmpty
|
||||
? SizedBox(
|
||||
height: 200,
|
||||
child: Column(
|
||||
children: [
|
||||
Padding(
|
||||
padding:
|
||||
const EdgeInsets.symmetric(horizontal: 15, vertical: 5),
|
||||
child: Row(
|
||||
children: [
|
||||
Text(context.l10n.backups,
|
||||
style: TextStyle(
|
||||
fontSize: 13, color: primaryColor(context))),
|
||||
],
|
||||
),
|
||||
),
|
||||
Expanded(
|
||||
child: ListView.builder(
|
||||
itemCount: files.length,
|
||||
itemBuilder: (_, index) {
|
||||
final file = files[index];
|
||||
final name =
|
||||
'mangayomi_${file.path.substringAfter('mangayomi_')}';
|
||||
return ListTile(
|
||||
title: Text(name),
|
||||
trailing: PopupMenuButton(itemBuilder: (context) {
|
||||
return [
|
||||
PopupMenuItem<int>(
|
||||
value: 0, child: Text(context.l10n.share)),
|
||||
PopupMenuItem<int>(
|
||||
value: 1, child: Text(context.l10n.restore)),
|
||||
];
|
||||
}, onSelected: (value) {
|
||||
if (value == 0) {
|
||||
Share.shareXFiles([XFile(file.path)], text: name);
|
||||
} else if (value == 1) {
|
||||
ref.watch(doRestoreProvider(
|
||||
path: file.path, context: context));
|
||||
}
|
||||
}),
|
||||
);
|
||||
}),
|
||||
),
|
||||
],
|
||||
),
|
||||
)
|
||||
: Container();
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -4,6 +4,7 @@ import 'package:archive/archive_io.dart';
|
|||
import 'package:bot_toast/bot_toast.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:isar/isar.dart';
|
||||
import 'package:mangayomi/eval/model/source_preference.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/category.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
|
|
@ -104,6 +105,14 @@ void doBackUp(DoBackUpRef ref,
|
|||
.map((e) => e.toJson())
|
||||
.toList();
|
||||
datas.addAll({"extensions": res});
|
||||
final resSourePref = isar.sourcePreferences
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.keyIsNotNull()
|
||||
.findAllSync()
|
||||
.map((e) => e.toJson())
|
||||
.toList();
|
||||
datas.addAll({"extensions_preferences": resSourePref});
|
||||
}
|
||||
final name =
|
||||
'mangayomi_${DateTime.now().toString().substringBefore(' ').replaceAll('-', '_')}';
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'backup.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$doBackUpHash() => r'4418d6aa9ea87ffa30195af59f9e93f95f7915f6';
|
||||
String _$doBackUpHash() => r'44abdf2cffcd6c6470234cd378f5b802a2aff7ba';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ import 'package:archive/archive_io.dart';
|
|||
import 'package:bot_toast/bot_toast.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:mangayomi/eval/model/m_bridge.dart';
|
||||
import 'package:mangayomi/eval/model/source_preference.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/category.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
|
|
@ -55,6 +56,9 @@ void doRestore(DoRestoreRef ref,
|
|||
final extensions = (backup["extensions"] as List?)
|
||||
?.map((e) => Source.fromJson(e))
|
||||
.toList();
|
||||
final extensionsPref = (backup["extensions_preferences"] as List?)
|
||||
?.map((e) => SourcePreference.fromJson(e))
|
||||
.toList();
|
||||
|
||||
isar.writeTxnSync(() {
|
||||
isar.mangas.clearSync();
|
||||
|
|
@ -114,6 +118,11 @@ void doRestore(DoRestoreRef ref,
|
|||
isar.sources.putAllSync(extensions);
|
||||
}
|
||||
|
||||
isar.sourcePreferences.clearSync();
|
||||
if (extensionsPref != null) {
|
||||
isar.sourcePreferences.putAllSync(extensionsPref);
|
||||
}
|
||||
|
||||
isar.settings.clearSync();
|
||||
if (settings != null) {
|
||||
isar.settings.putAllSync(settings);
|
||||
|
|
|
|||
|
|
@ -6,7 +6,7 @@ part of 'restore.dart';
|
|||
// RiverpodGenerator
|
||||
// **************************************************************************
|
||||
|
||||
String _$doRestoreHash() => r'3faca290a7217c27da2cdf21a559cec077a0201e';
|
||||
String _$doRestoreHash() => r'3c88ad8ba80c245a4b511961111f7ab79c0d330f';
|
||||
|
||||
/// Copied from Dart SDK
|
||||
class _SystemHash {
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ final testSourceModel = Source(
|
|||
name: "Test Source",
|
||||
// Example: https://gogoanime3.net
|
||||
baseUrl: "",
|
||||
//
|
||||
// source code
|
||||
sourceCode: testSourceCode,
|
||||
// Example: en
|
||||
lang: "",
|
||||
|
|
|
|||
|
|
@ -61,8 +61,8 @@ packages:
|
|||
dependency: "direct main"
|
||||
description:
|
||||
path: "."
|
||||
ref: "357595bb930360f2a153f84aeb85b8614a0eb4c3"
|
||||
resolved-ref: "357595bb930360f2a153f84aeb85b8614a0eb4c3"
|
||||
ref: c66de6ad76ddaf74399cbdeeed42d04126e88e4b
|
||||
resolved-ref: c66de6ad76ddaf74399cbdeeed42d04126e88e4b
|
||||
url: "https://github.com/kodjodevf/background_downloader.git"
|
||||
source: git
|
||||
version: "7.12.3"
|
||||
|
|
|
|||
|
|
@ -32,7 +32,7 @@ dependencies:
|
|||
background_downloader:
|
||||
git:
|
||||
url: https://github.com/kodjodevf/background_downloader.git
|
||||
ref: 357595bb930360f2a153f84aeb85b8614a0eb4c3
|
||||
ref: c66de6ad76ddaf74399cbdeeed42d04126e88e4b
|
||||
permission_handler: ^11.0.1
|
||||
flutter_inappwebview: ^5.7.2+3
|
||||
draggable_menu: ^4.4.0
|
||||
|
|
|
|||
Loading…
Reference in a new issue