+
- 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:
parent
52f5882e98
commit
12d15f24d0
6 changed files with 71 additions and 79 deletions
|
|
@ -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),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
),
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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),
|
||||
|
|
|
|||
|
|
@ -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(() {});
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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>;
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Reference in a new issue