This commit is contained in:
kodjomoustapha 2024-08-02 11:21:42 +01:00
parent 15c8fea384
commit 2ff3c0ebcc
9 changed files with 163 additions and 129 deletions

View file

@ -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),

View file

@ -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();
},
);
},
)))

View file

@ -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();
},
);
},
)

View file

@ -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,

View file

@ -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(

View file

@ -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;
}

View file

@ -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 {

View 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;
}
}
}
}
}

View file

@ -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: