mirror of
https://github.com/kodjodevf/mangayomi.git
synced 2026-03-11 17:25:32 +00:00
+
This commit is contained in:
parent
15c8fea384
commit
2ff3c0ebcc
9 changed files with 163 additions and 129 deletions
|
|
@ -10,12 +10,11 @@ import 'package:mangayomi/models/chapter.dart';
|
|||
import 'package:mangayomi/models/history.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/modules/history/providers/isar_providers.dart';
|
||||
import 'package:mangayomi/modules/manga/reader/providers/push_router.dart';
|
||||
import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart';
|
||||
import 'package:mangayomi/providers/l10n_providers.dart';
|
||||
import 'package:mangayomi/utils/cached_network.dart';
|
||||
import 'package:mangayomi/utils/constant.dart';
|
||||
import 'package:mangayomi/utils/date.dart';
|
||||
import 'package:mangayomi/utils/extensions/chapter.dart';
|
||||
import 'package:mangayomi/utils/headers.dart';
|
||||
import 'package:mangayomi/modules/library/widgets/search_text_form_field.dart';
|
||||
import 'package:mangayomi/modules/widgets/error_text.dart';
|
||||
|
|
@ -232,24 +231,7 @@ class _HistoryTabState extends ConsumerState<HistoryTab> {
|
|||
elevation: 0,
|
||||
shadowColor: Colors.transparent),
|
||||
onPressed: () {
|
||||
if (!chapter.isRead!) {
|
||||
pushMangaReaderView(context: context, chapter: chapter);
|
||||
} else {
|
||||
final filteredChaps =
|
||||
chapter.manga.value!.getFilteredChapterList();
|
||||
bool exist = false;
|
||||
for (var filteredChap in filteredChaps.reversed) {
|
||||
if (filteredChap.toJson().toString() ==
|
||||
chapter.toJson().toString()) {
|
||||
exist = true;
|
||||
}
|
||||
if (exist && !filteredChap.isRead!) {
|
||||
pushMangaReaderView(
|
||||
context: context, chapter: filteredChap);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
chapter.pushToReaderView(context);
|
||||
},
|
||||
child: Padding(
|
||||
padding: const EdgeInsets.symmetric(horizontal: 12),
|
||||
|
|
|
|||
|
|
@ -3,23 +3,22 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:isar/isar.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/models/download.dart';
|
||||
import 'package:mangayomi/modules/history/providers/isar_providers.dart';
|
||||
import 'package:mangayomi/models/history.dart';
|
||||
import 'package:mangayomi/modules/library/providers/isar_providers.dart';
|
||||
import 'package:mangayomi/modules/library/providers/library_state_provider.dart';
|
||||
import 'package:mangayomi/modules/manga/reader/providers/push_router.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart';
|
||||
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
|
||||
import 'package:mangayomi/utils/constant.dart';
|
||||
import 'package:mangayomi/utils/extensions/chapter.dart';
|
||||
import 'package:mangayomi/utils/headers.dart';
|
||||
import 'package:mangayomi/modules/more/providers/incognito_mode_state_provider.dart';
|
||||
import 'package:mangayomi/modules/widgets/bottom_text_widget.dart';
|
||||
import 'package:mangayomi/modules/widgets/cover_view_widget.dart';
|
||||
import 'package:mangayomi/modules/widgets/error_text.dart';
|
||||
import 'package:mangayomi/modules/widgets/gridview_widget.dart';
|
||||
import 'package:mangayomi/modules/widgets/manga_image_card_widget.dart';
|
||||
import 'package:mangayomi/modules/widgets/progress_center.dart';
|
||||
|
||||
class LibraryGridViewWidget extends StatefulWidget {
|
||||
final bool isCoverOnlyGrid;
|
||||
|
|
@ -274,25 +273,55 @@ class _LibraryGridViewWidgetState extends State<LibraryGridViewWidget> {
|
|||
padding: const EdgeInsets.all(9),
|
||||
child: Consumer(
|
||||
builder: (context, ref, child) {
|
||||
final history = ref.watch(
|
||||
getAllHistoryStreamProvider(
|
||||
isManga: entry.isManga!));
|
||||
return history.when(
|
||||
data: (data) {
|
||||
final incognitoMode =
|
||||
ref.watch(incognitoModeStateProvider);
|
||||
final entries = data
|
||||
.where((element) =>
|
||||
element.mangaId == entry.id)
|
||||
.toList();
|
||||
if (entries.isNotEmpty && !incognitoMode) {
|
||||
return StreamBuilder(
|
||||
stream: isar.historys
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.and()
|
||||
.chapter((q) => q.manga((q) =>
|
||||
q.isMangaEqualTo(entry.isManga!)))
|
||||
.watch(fireImmediately: true),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData &&
|
||||
snapshot.data!.isNotEmpty) {
|
||||
final incognitoMode =
|
||||
ref.watch(incognitoModeStateProvider);
|
||||
final entries = snapshot.data!
|
||||
.where((element) =>
|
||||
element.mangaId == entry.id)
|
||||
.toList();
|
||||
if (entries.isNotEmpty &&
|
||||
!incognitoMode) {
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
entries.first.chapter.value!
|
||||
.pushToReaderView(context);
|
||||
},
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius:
|
||||
BorderRadius.circular(5),
|
||||
color: context.primaryColor
|
||||
.withOpacity(0.9),
|
||||
),
|
||||
child: const Padding(
|
||||
padding: EdgeInsets.all(7),
|
||||
child: Icon(
|
||||
Icons.play_arrow,
|
||||
size: 19,
|
||||
color: Colors.white,
|
||||
)),
|
||||
),
|
||||
);
|
||||
}
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
pushMangaReaderView(
|
||||
context: context,
|
||||
chapter:
|
||||
entries.first.chapter.value!,
|
||||
);
|
||||
entry.chapters
|
||||
.toList()
|
||||
.reversed
|
||||
.toList()
|
||||
.last
|
||||
.pushToReaderView(context);
|
||||
},
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
|
|
@ -313,13 +342,12 @@ class _LibraryGridViewWidgetState extends State<LibraryGridViewWidget> {
|
|||
}
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
pushMangaReaderView(
|
||||
context: context,
|
||||
chapter: entry.chapters
|
||||
.toList()
|
||||
.reversed
|
||||
.toList()
|
||||
.last);
|
||||
entry.chapters
|
||||
.toList()
|
||||
.reversed
|
||||
.toList()
|
||||
.last
|
||||
.pushToReaderView(context);
|
||||
},
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
|
|
@ -338,12 +366,6 @@ class _LibraryGridViewWidgetState extends State<LibraryGridViewWidget> {
|
|||
),
|
||||
);
|
||||
},
|
||||
error: (Object error, StackTrace stackTrace) {
|
||||
return ErrorText(error);
|
||||
},
|
||||
loading: () {
|
||||
return const ProgressCenter();
|
||||
},
|
||||
);
|
||||
},
|
||||
)))
|
||||
|
|
|
|||
|
|
@ -3,21 +3,20 @@ import 'package:flutter/material.dart';
|
|||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||||
import 'package:isar/isar.dart';
|
||||
import 'package:mangayomi/main.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/models/download.dart';
|
||||
import 'package:mangayomi/modules/history/providers/isar_providers.dart';
|
||||
import 'package:mangayomi/models/history.dart';
|
||||
import 'package:mangayomi/modules/library/providers/isar_providers.dart';
|
||||
import 'package:mangayomi/modules/library/providers/library_state_provider.dart';
|
||||
import 'package:mangayomi/modules/manga/reader/providers/push_router.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart';
|
||||
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
|
||||
import 'package:mangayomi/utils/constant.dart';
|
||||
import 'package:mangayomi/utils/extensions/chapter.dart';
|
||||
import 'package:mangayomi/utils/headers.dart';
|
||||
import 'package:mangayomi/modules/more/providers/incognito_mode_state_provider.dart';
|
||||
import 'package:mangayomi/modules/widgets/error_text.dart';
|
||||
import 'package:mangayomi/modules/widgets/listview_widget.dart';
|
||||
import 'package:mangayomi/modules/widgets/manga_image_card_widget.dart';
|
||||
import 'package:mangayomi/modules/widgets/progress_center.dart';
|
||||
|
||||
class LibraryListViewWidget extends StatelessWidget {
|
||||
final List<Manga> entriesManga;
|
||||
|
|
@ -259,24 +258,54 @@ class LibraryListViewWidget extends StatelessWidget {
|
|||
if (continueReaderBtn)
|
||||
Consumer(
|
||||
builder: (context, ref, child) {
|
||||
final history = ref.watch(
|
||||
getAllHistoryStreamProvider(
|
||||
isManga: entry.isManga!));
|
||||
return history.when(
|
||||
data: (data) {
|
||||
final incognitoMode =
|
||||
ref.watch(incognitoModeStateProvider);
|
||||
final entries = data
|
||||
.where((element) =>
|
||||
element.mangaId == entry.id)
|
||||
.toList();
|
||||
if (entries.isNotEmpty && !incognitoMode) {
|
||||
return StreamBuilder(
|
||||
stream: isar.historys
|
||||
.filter()
|
||||
.idIsNotNull()
|
||||
.and()
|
||||
.chapter((q) => q.manga((q) =>
|
||||
q.isMangaEqualTo(entry.isManga!)))
|
||||
.watch(fireImmediately: true),
|
||||
builder: (context, snapshot) {
|
||||
if (snapshot.hasData &&
|
||||
snapshot.data!.isNotEmpty) {
|
||||
final incognitoMode =
|
||||
ref.watch(incognitoModeStateProvider);
|
||||
final entries = snapshot.data!
|
||||
.where((element) =>
|
||||
element.mangaId == entry.id)
|
||||
.toList();
|
||||
if (entries.isNotEmpty && !incognitoMode) {
|
||||
final chap = entries.first.chapter.value!;
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
chap.pushToReaderView(context);
|
||||
},
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
borderRadius:
|
||||
BorderRadius.circular(5),
|
||||
color: context.primaryColor
|
||||
.withOpacity(0.9),
|
||||
),
|
||||
child: const Padding(
|
||||
padding: EdgeInsets.all(7),
|
||||
child: Icon(
|
||||
Icons.play_arrow,
|
||||
size: 19,
|
||||
color: Colors.white,
|
||||
)),
|
||||
),
|
||||
);
|
||||
}
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
pushMangaReaderView(
|
||||
context: context,
|
||||
chapter: entries.first.chapter.value!,
|
||||
);
|
||||
entry.chapters
|
||||
.toList()
|
||||
.reversed
|
||||
.toList()
|
||||
.last
|
||||
.pushToReaderView(context);
|
||||
},
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
|
|
@ -297,13 +326,12 @@ class LibraryListViewWidget extends StatelessWidget {
|
|||
}
|
||||
return GestureDetector(
|
||||
onTap: () {
|
||||
pushMangaReaderView(
|
||||
context: context,
|
||||
chapter: entry.chapters
|
||||
.toList()
|
||||
.reversed
|
||||
.toList()
|
||||
.last);
|
||||
entry.chapters
|
||||
.toList()
|
||||
.reversed
|
||||
.toList()
|
||||
.last
|
||||
.pushToReaderView(context);
|
||||
},
|
||||
child: Container(
|
||||
decoration: BoxDecoration(
|
||||
|
|
@ -321,12 +349,6 @@ class LibraryListViewWidget extends StatelessWidget {
|
|||
),
|
||||
);
|
||||
},
|
||||
error: (Object error, StackTrace stackTrace) {
|
||||
return ErrorText(error);
|
||||
},
|
||||
loading: () {
|
||||
return const ProgressCenter();
|
||||
},
|
||||
);
|
||||
},
|
||||
)
|
||||
|
|
|
|||
|
|
@ -7,9 +7,7 @@ import 'package:mangayomi/models/category.dart';
|
|||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/models/history.dart';
|
||||
import 'package:mangayomi/modules/manga/detail/widgets/custom_floating_action_btn.dart';
|
||||
import 'package:mangayomi/modules/manga/reader/providers/push_router.dart';
|
||||
import 'package:mangayomi/models/manga.dart';
|
||||
import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart';
|
||||
import 'package:mangayomi/providers/l10n_providers.dart';
|
||||
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
|
||||
import 'package:mangayomi/utils/constant.dart';
|
||||
|
|
@ -18,6 +16,7 @@ import 'package:mangayomi/modules/manga/detail/providers/state_providers.dart';
|
|||
import 'package:mangayomi/modules/manga/detail/widgets/chapter_filter_list_tile_widget.dart';
|
||||
import 'package:mangayomi/modules/more/providers/incognito_mode_state_provider.dart';
|
||||
import 'package:mangayomi/modules/widgets/progress_center.dart';
|
||||
import 'package:mangayomi/utils/extensions/chapter.dart';
|
||||
|
||||
class MangaDetailsView extends ConsumerStatefulWidget {
|
||||
final Manga manga;
|
||||
|
|
@ -78,27 +77,7 @@ class _MangaDetailsViewState extends ConsumerState<MangaDetailsView> {
|
|||
isExtended: !isExtended,
|
||||
label: l10n.resume,
|
||||
onPressed: () {
|
||||
if (!chap.isRead!) {
|
||||
pushMangaReaderView(
|
||||
context: context, chapter: chap);
|
||||
} else {
|
||||
final filteredChaps = chap.manga.value!
|
||||
.getFilteredChapterList();
|
||||
bool exist = false;
|
||||
for (var filteredChap
|
||||
in filteredChaps.reversed) {
|
||||
if (filteredChap.toJson().toString() ==
|
||||
chap.toJson().toString()) {
|
||||
exist = true;
|
||||
}
|
||||
if (exist && !filteredChap.isRead!) {
|
||||
pushMangaReaderView(
|
||||
context: context,
|
||||
chapter: filteredChap);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
chap.pushToReaderView(context);
|
||||
},
|
||||
textWidth: 70,
|
||||
width: 110,
|
||||
|
|
@ -108,13 +87,12 @@ class _MangaDetailsViewState extends ConsumerState<MangaDetailsView> {
|
|||
isExtended: !isExtended,
|
||||
label: l10n.read,
|
||||
onPressed: () {
|
||||
pushMangaReaderView(
|
||||
context: context,
|
||||
chapter: widget.manga.chapters
|
||||
.toList()
|
||||
.reversed
|
||||
.toList()
|
||||
.last);
|
||||
widget.manga.chapters
|
||||
.toList()
|
||||
.reversed
|
||||
.toList()
|
||||
.last
|
||||
.pushToReaderView(context);
|
||||
},
|
||||
textWidth: isFr ? 80 : 40,
|
||||
width: isFr ? 130 : 90,
|
||||
|
|
|
|||
|
|
@ -3,8 +3,8 @@ import 'package:flutter_riverpod/flutter_riverpod.dart';
|
|||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/providers/l10n_providers.dart';
|
||||
import 'package:mangayomi/utils/date.dart';
|
||||
import 'package:mangayomi/modules/manga/reader/providers/push_router.dart';
|
||||
import 'package:mangayomi/utils/extensions/build_context_extensions.dart';
|
||||
import 'package:mangayomi/utils/extensions/chapter.dart';
|
||||
import 'package:mangayomi/utils/extensions/string_extensions.dart';
|
||||
import 'package:mangayomi/modules/manga/detail/providers/state_providers.dart';
|
||||
import 'package:mangayomi/modules/manga/download/download_page_widget.dart';
|
||||
|
|
@ -51,7 +51,7 @@ class ChapterListTileWidget extends ConsumerWidget {
|
|||
if (isLongPressed) {
|
||||
ref.read(chaptersListStateProvider.notifier).update(chapter);
|
||||
} else {
|
||||
pushMangaReaderView(context: context, chapter: chapter);
|
||||
chapter.pushToReaderView(context, ignoreIsRead: true);
|
||||
}
|
||||
},
|
||||
title: Row(
|
||||
|
|
|
|||
|
|
@ -1,7 +1,9 @@
|
|||
import 'dart:async';
|
||||
import 'dart:isolate';
|
||||
import 'package:flutter/foundation.dart';
|
||||
import 'package:mangayomi/modules/manga/reader/reader_view.dart';
|
||||
import 'package:mangayomi/src/rust/api/image.dart';
|
||||
import 'package:mangayomi/src/rust/frb_generated.dart';
|
||||
import 'package:mangayomi/utils/extensions/others.dart';
|
||||
import 'package:riverpod_annotation/riverpod_annotation.dart';
|
||||
part 'crop_borders_provider.g.dart';
|
||||
|
|
@ -18,7 +20,12 @@ Future<Uint8List?> cropBorders(CropBordersRef ref,
|
|||
return null;
|
||||
}
|
||||
|
||||
return processCropImage(image: imageBytes);
|
||||
return await Isolate.run(() async {
|
||||
await RustLib.init();
|
||||
final imageRes = processCropImage(image: imageBytes!);
|
||||
RustLib.dispose();
|
||||
return imageRes;
|
||||
});
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -5,10 +5,10 @@ import 'package:mangayomi/main.dart';
|
|||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/models/source.dart';
|
||||
|
||||
pushMangaReaderView({
|
||||
Future<void> pushMangaReaderView({
|
||||
required BuildContext context,
|
||||
required Chapter chapter,
|
||||
}) {
|
||||
}) async {
|
||||
final sourceExist = isar.sources
|
||||
.filter()
|
||||
.langContains(chapter.manga.value!.lang!, caseSensitive: false)
|
||||
|
|
@ -24,17 +24,15 @@ pushMangaReaderView({
|
|||
.isNotEmpty;
|
||||
if (sourceExist || chapter.manga.value!.isLocalArchive!) {
|
||||
if (chapter.manga.value!.isManga!) {
|
||||
context.push('/mangareaderview', extra: chapter);
|
||||
await context.push('/mangareaderview', extra: chapter);
|
||||
} else {
|
||||
context.push('/animePlayerView', extra: chapter);
|
||||
await context.push('/animePlayerView', extra: chapter);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
pushReplacementMangaReaderView({
|
||||
required BuildContext context,
|
||||
required Chapter chapter,
|
||||
}) {
|
||||
void pushReplacementMangaReaderView(
|
||||
{required BuildContext context, required Chapter chapter}) {
|
||||
if (chapter.manga.value!.isManga!) {
|
||||
context.pushReplacement('/mangareaderview', extra: chapter);
|
||||
} else {
|
||||
|
|
|
|||
25
lib/utils/extensions/chapter.dart
Normal file
25
lib/utils/extensions/chapter.dart
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
import 'package:flutter/material.dart';
|
||||
import 'package:mangayomi/models/chapter.dart';
|
||||
import 'package:mangayomi/modules/manga/reader/providers/push_router.dart';
|
||||
import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.dart';
|
||||
|
||||
extension ChapterExtension on Chapter {
|
||||
Future<void> pushToReaderView(BuildContext context,
|
||||
{bool ignoreIsRead = false}) async {
|
||||
if (ignoreIsRead || !isRead!) {
|
||||
await pushMangaReaderView(context: context, chapter: this);
|
||||
} else {
|
||||
final filteredChaps = manga.value!.getFilteredChapterList();
|
||||
bool exist = false;
|
||||
for (var filteredChap in filteredChaps.reversed) {
|
||||
if (filteredChap.toJson().toString() == toJson().toString()) {
|
||||
exist = true;
|
||||
}
|
||||
if (exist && !filteredChap.isRead!) {
|
||||
await pushMangaReaderView(context: context, chapter: filteredChap);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -54,7 +54,7 @@ dependencies:
|
|||
window_manager: ^0.3.9
|
||||
ffi: ^2.1.2
|
||||
ffigen: ^12.0.0
|
||||
http_interceptor: ^2.0.0-beta.8
|
||||
http_interceptor: ^2.0.0
|
||||
js_packer: ^0.0.5
|
||||
flutter_windows_webview:
|
||||
git:
|
||||
|
|
|
|||
Loading…
Reference in a new issue