- Fix slider not working when in horizontal continue mode
- Refactor getting chapter image provider method
- Fix crop image border when loading whith network
This commit is contained in:
kodjomoustapha 2024-05-07 17:55:14 +01:00
parent 52f5882e98
commit 12d15f24d0
6 changed files with 71 additions and 79 deletions

View file

@ -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<UChapDataPreload?> 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<DoubleColummView> createState() => _DoubleColummViewState();
@ -200,7 +198,6 @@ class _DoubleColummViewState extends State<DoubleColummView>
}
return null;
},
cropBorders: widget.cropBorders,
onLongPressData: (datas) =>
widget.onLongPressData.call(datas),
),
@ -279,7 +276,6 @@ class _DoubleColummViewState extends State<DoubleColummView>
}
return null;
},
cropBorders: widget.cropBorders,
onLongPressData: (datas) =>
widget.onLongPressData.call(datas),
),

View file

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

View file

@ -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<Object>,
image: image,
fit: getBoxFit(scaleType),
filterQuality: FilterQuality.medium,
enableMemoryCache: true,

View file

@ -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<Object>,
image: image,
filterQuality: FilterQuality.medium,
handleLoadingProgress: true,
fit: getBoxFit(scaleType),

View file

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

View file

@ -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<T> on T {
@ -50,4 +54,26 @@ extension UChapDataPreloadExtensions on UChapDataPreload {
}
return imageBytes;
}
ImageProvider<Object> 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<Object>;
}
}