From 12d15f24d0b0a0e5d2c2a9e8c11d6e4158040a57 Mon Sep 17 00:00:00 2001 From: kodjomoustapha <107993382+kodjodevf@users.noreply.github.com> Date: Tue, 7 May 2024 17:55:14 +0100 Subject: [PATCH] + - Fix slider not working when in horizontal continue mode - Refactor getting chapter image provider method - Fix crop image border when loading whith network --- .../reader/double_columm_view_center.dart | 6 +-- .../reader/double_columm_view_vertical.dart | 6 +-- .../manga/reader/image_view_center.dart | 31 ++---------- .../manga/reader/image_view_vertical.dart | 31 ++---------- lib/modules/manga/reader/reader_view.dart | 50 ++++++++++++------- lib/utils/extensions/others.dart | 26 ++++++++++ 6 files changed, 71 insertions(+), 79 deletions(-) diff --git a/lib/modules/manga/reader/double_columm_view_center.dart b/lib/modules/manga/reader/double_columm_view_center.dart index f30fabf..a94578e 100644 --- a/lib/modules/manga/reader/double_columm_view_center.dart +++ b/lib/modules/manga/reader/double_columm_view_center.dart @@ -12,7 +12,6 @@ import 'package:photo_view/photo_view.dart'; import 'package:photo_view/photo_view_gallery.dart'; class DoubleColummView extends StatefulWidget { - final bool cropBorders; final List datas; final Function(UChapDataPreload datas) onLongPressData; final Function(double) scale; @@ -24,8 +23,7 @@ class DoubleColummView extends StatefulWidget { required this.scale, required this.onLongPressData, required this.backgroundColor, - required this.isFailedToLoadImage, - required this.cropBorders}); + required this.isFailedToLoadImage}); @override State createState() => _DoubleColummViewState(); @@ -200,7 +198,6 @@ class _DoubleColummViewState extends State } return null; }, - cropBorders: widget.cropBorders, onLongPressData: (datas) => widget.onLongPressData.call(datas), ), @@ -279,7 +276,6 @@ class _DoubleColummViewState extends State } return null; }, - cropBorders: widget.cropBorders, onLongPressData: (datas) => widget.onLongPressData.call(datas), ), diff --git a/lib/modules/manga/reader/double_columm_view_vertical.dart b/lib/modules/manga/reader/double_columm_view_vertical.dart index 7245ae7..73fad26 100644 --- a/lib/modules/manga/reader/double_columm_view_vertical.dart +++ b/lib/modules/manga/reader/double_columm_view_vertical.dart @@ -9,7 +9,6 @@ import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; class DoubleColummVerticalView extends StatelessWidget { - final bool cropBorders; final List datas; final Function(UChapDataPreload datas) onLongPressData; final Function(double) scale; @@ -21,8 +20,7 @@ class DoubleColummVerticalView extends StatelessWidget { required this.scale, required this.onLongPressData, required this.backgroundColor, - required this.isFailedToLoadImage, - required this.cropBorders}); + required this.isFailedToLoadImage}); @override Widget build(BuildContext context) { @@ -104,7 +102,6 @@ class DoubleColummVerticalView extends StatelessWidget { } return null; }, - cropBorders: cropBorders, onLongPressData: (datas) => onLongPressData.call(datas), ), ), @@ -176,7 +173,6 @@ class DoubleColummVerticalView extends StatelessWidget { } return null; }, - cropBorders: cropBorders, onLongPressData: (datas) => onLongPressData.call(datas), ), ), diff --git a/lib/modules/manga/reader/image_view_center.dart b/lib/modules/manga/reader/image_view_center.dart index d9ab495..248b9d3 100644 --- a/lib/modules/manga/reader/image_view_center.dart +++ b/lib/modules/manga/reader/image_view_center.dart @@ -1,5 +1,3 @@ -import 'dart:io'; -import 'dart:typed_data'; import 'package:extended_image/extended_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -7,13 +5,10 @@ import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provi import 'package:mangayomi/modules/manga/reader/reader_view.dart'; import 'package:mangayomi/modules/manga/reader/widgets/color_filter_widget.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; -import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart'; -import 'package:mangayomi/utils/headers.dart'; -import 'package:mangayomi/utils/reg_exp_matcher.dart'; +import 'package:mangayomi/utils/extensions/others.dart'; class ImageViewCenter extends ConsumerWidget { final UChapDataPreload data; - final bool cropBorders; final Function(UChapDataPreload data) onLongPressData; final Widget? Function(ExtendedImageState state) loadStateChanged; final Function(ExtendedImageGestureState state)? onDoubleTap; @@ -22,7 +17,6 @@ class ImageViewCenter extends ConsumerWidget { const ImageViewCenter({ super.key, required this.data, - required this.cropBorders, required this.onLongPressData, required this.loadStateChanged, this.onDoubleTap, @@ -31,32 +25,17 @@ class ImageViewCenter extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final cropImageExist = cropBorders && data.cropImage != null; - - return _imageView(cropImageExist ? true : data.isLocale!, - cropImageExist ? data.cropImage : data.archiveImage, ref); + return _imageView(ref); } - Widget _imageView(bool isLocale, Uint8List? archiveImage, WidgetRef ref) { + Widget _imageView(WidgetRef ref) { final scaleType = ref.watch(scaleTypeStateProvider); - final image = isLocale - ? archiveImage != null - ? ExtendedMemoryImageProvider(archiveImage) - : ExtendedFileImageProvider( - File('${data.directory!.path}${padIndex(data.index! + 1)}.jpg')) - : CustomExtendedNetworkImageProvider( - data.url!.trim().trimLeft().trimRight(), - cache: true, - cacheMaxAge: const Duration(days: 7), - headers: ref.watch(headersProvider( - source: data.chapter!.manga.value!.source!, - lang: data.chapter!.manga.value!.lang!))); - + final image = data.getImageProvider(ref); return GestureDetector( onLongPress: () => onLongPressData.call(data), child: ColorFilterWidget( child: ExtendedImage( - image: image as ImageProvider, + image: image, fit: getBoxFit(scaleType), filterQuality: FilterQuality.medium, enableMemoryCache: true, diff --git a/lib/modules/manga/reader/image_view_vertical.dart b/lib/modules/manga/reader/image_view_vertical.dart index c56d1f3..e75393a 100644 --- a/lib/modules/manga/reader/image_view_vertical.dart +++ b/lib/modules/manga/reader/image_view_vertical.dart @@ -1,5 +1,3 @@ -import 'dart:io'; -import 'dart:typed_data'; import 'package:extended_image/extended_image.dart'; import 'package:flutter/material.dart'; import 'package:flutter_riverpod/flutter_riverpod.dart'; @@ -7,17 +5,14 @@ import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provi import 'package:mangayomi/modules/manga/reader/reader_view.dart'; import 'package:mangayomi/modules/manga/reader/widgets/color_filter_widget.dart'; import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; -import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart'; import 'package:mangayomi/providers/l10n_providers.dart'; import 'package:mangayomi/utils/extensions/build_context_extensions.dart'; -import 'package:mangayomi/utils/headers.dart'; -import 'package:mangayomi/utils/reg_exp_matcher.dart'; +import 'package:mangayomi/utils/extensions/others.dart'; import 'package:mangayomi/modules/manga/reader/widgets/circular_progress_indicator_animate_rotate.dart'; class ImageViewVertical extends ConsumerWidget { final UChapDataPreload data; final Function(UChapDataPreload data) onLongPressData; - final bool cropBorders; final bool isHorizontal; final Function(bool) failedToLoadImage; @@ -26,36 +21,20 @@ class ImageViewVertical extends ConsumerWidget { {super.key, required this.data, required this.onLongPressData, - required this.cropBorders, required this.failedToLoadImage, required this.isHorizontal}); @override Widget build(BuildContext context, WidgetRef ref) { - final cropImageExist = cropBorders && data.cropImage != null; - - return _imageView(cropImageExist ? true : data.isLocale!, - cropImageExist ? data.cropImage : data.archiveImage, context, ref); + return _imageView(context, ref); } - Widget _imageView(bool isLocale, Uint8List? archiveImage, - BuildContext context, WidgetRef ref) { - final image = isLocale - ? archiveImage != null - ? ExtendedMemoryImageProvider(archiveImage) - : ExtendedFileImageProvider( - File('${data.directory!.path}${padIndex(data.index! + 1)}.jpg')) - : CustomExtendedNetworkImageProvider( - data.url!.trim().trimLeft().trimRight(), - cache: true, - cacheMaxAge: const Duration(days: 7), - headers: ref.watch(headersProvider( - source: data.chapter!.manga.value!.source!, - lang: data.chapter!.manga.value!.lang!))); + Widget _imageView(BuildContext context, WidgetRef ref) { + final image = data.getImageProvider(ref); final scaleType = ref.watch(scaleTypeStateProvider); final l10n = l10nLocalizations(context)!; final imageWidget = ExtendedImage( - image: image as ImageProvider, + image: image, filterQuality: FilterQuality.medium, handleLoadingProgress: true, fit: getBoxFit(scaleType), diff --git a/lib/modules/manga/reader/reader_view.dart b/lib/modules/manga/reader/reader_view.dart index 3d3b832..18389ea 100644 --- a/lib/modules/manga/reader/reader_view.dart +++ b/lib/modules/manga/reader/reader_view.dart @@ -550,7 +550,6 @@ class _MangaChapterPageGalleryState backgroundColor: backgroundColor, isFailedToLoadImage: (val) {}, - cropBorders: cropBorders, onLongPressData: (datas) { _onLongPressImageDialog( datas, context); @@ -562,7 +561,6 @@ class _MangaChapterPageGalleryState failedToLoadImage: (value) { // _failedToLoadImage.value = value; }, - cropBorders: cropBorders, onLongPressData: (datas) { _onLongPressImageDialog( datas, context); @@ -629,7 +627,6 @@ class _MangaChapterPageGalleryState _failedToLoadImage.value = val; } }, - cropBorders: cropBorders, onLongPressData: (datas) { _onLongPressImageDialog( datas, context); @@ -827,7 +824,6 @@ class _MangaChapterPageGalleryState _doubleClickAnimationController .forward(); }, - cropBorders: cropBorders, onLongPressData: (datas) { _onLongPressImageDialog( datas, context); @@ -879,12 +875,6 @@ class _MangaChapterPageGalleryState context); } } - if (_uChapDataPreload[index].cropImage != null) { - precacheImage( - ExtendedMemoryImageProvider( - (_uChapDataPreload[index].cropImage)!), - context); - } } } catch (_) {} } @@ -1110,7 +1100,8 @@ class _MangaChapterPageGalleryState ref.watch(animatePageTransitionsStateProvider); if (isPrev) { if (readerMode == ReaderMode.verticalContinuous || - readerMode == ReaderMode.webtoon) { + readerMode == ReaderMode.webtoon || + readerMode == ReaderMode.horizontalContinuous) { if (index != -1) { if (isSlide) { _itemScrollController.jumpTo( @@ -1144,7 +1135,8 @@ class _MangaChapterPageGalleryState } } else { if (readerMode == ReaderMode.verticalContinuous || - readerMode == ReaderMode.webtoon) { + readerMode == ReaderMode.webtoon || + readerMode == ReaderMode.horizontalContinuous) { if (isSlide) { _itemScrollController.jumpTo( index: index, @@ -1282,6 +1274,25 @@ class _MangaChapterPageGalleryState setState(() {}); } }); + } else { + if (!mounted) return; + final ok = await ref.watch( + cropBordersProvider(data: _uChapDataPreload[i], cropBorder: true) + .future); + if (ok == null) { + ref.invalidate(cropBordersProvider( + data: _uChapDataPreload[i], cropBorder: true)); + ref + .watch(cropBordersProvider( + data: _uChapDataPreload[i], cropBorder: true) + .future) + .then((value) { + _uChapDataPreload[i] = _uChapDataPreload[i]..cropImage = value; + if (mounted) { + setState(() {}); + } + }); + } } } } @@ -1300,8 +1311,13 @@ class _MangaChapterPageGalleryState setState(() {}); } } else { - if (!_uChapDataPreload[index].isLocale! && - _uChapDataPreload[index].cropImage == null) { + if (!mounted) return; + final ok = await ref.watch( + cropBordersProvider(data: _uChapDataPreload[index], cropBorder: true) + .future); + if (ok == null) { + ref.invalidate(cropBordersProvider( + data: _uChapDataPreload[index], cropBorder: true)); ref .watch(cropBordersProvider( data: _uChapDataPreload[index], cropBorder: true) @@ -1309,10 +1325,10 @@ class _MangaChapterPageGalleryState .then((value) { _uChapDataPreload[index] = _uChapDataPreload[index] ..cropImage = value; + if (mounted) { + setState(() {}); + } }); - if (mounted) { - setState(() {}); - } } } } diff --git a/lib/utils/extensions/others.dart b/lib/utils/extensions/others.dart index 6c2b3f4..d25a61c 100644 --- a/lib/utils/extensions/others.dart +++ b/lib/utils/extensions/others.dart @@ -4,7 +4,11 @@ import 'dart:typed_data'; import 'dart:ui'; import 'package:extended_image/extended_image.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_riverpod/flutter_riverpod.dart'; import 'package:mangayomi/modules/manga/reader/reader_view.dart'; +import 'package:mangayomi/modules/more/settings/reader/providers/reader_state_provider.dart'; +import 'package:mangayomi/modules/widgets/custom_extended_image_provider.dart'; +import 'package:mangayomi/utils/headers.dart'; import 'package:mangayomi/utils/reg_exp_matcher.dart'; extension LetExtension on T { @@ -50,4 +54,26 @@ extension UChapDataPreloadExtensions on UChapDataPreload { } return imageBytes; } + + ImageProvider getImageProvider(WidgetRef ref) { + final data = this; + final isLocale = data.isLocale!; + final archiveImage = data.archiveImage; + final cropBorders = ref.watch(cropBordersStateProvider); + return cropBorders && data.cropImage != null + ? ExtendedMemoryImageProvider(data.cropImage!) + : (isLocale + ? archiveImage != null + ? ExtendedMemoryImageProvider(archiveImage) + : ExtendedFileImageProvider(File( + '${data.directory!.path}${padIndex(data.index! + 1)}.jpg')) + : CustomExtendedNetworkImageProvider( + data.url!.trim().trimLeft().trimRight(), + cache: true, + cacheMaxAge: const Duration(days: 7), + headers: ref.watch(headersProvider( + source: data.chapter!.manga.value!.source!, + lang: data.chapter!.manga.value! + .lang!)))) as ImageProvider; + } }