mangayomi/lib/modules/manga/reader/image_view_center.dart
2023-10-21 14:11:49 +01:00

83 lines
3.3 KiB
Dart

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';
import 'package:mangayomi/modules/manga/reader/providers/crop_borders_provider.dart';
import 'package:mangayomi/modules/manga/reader/providers/reader_controller_provider.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/utils/headers.dart';
import 'package:mangayomi/utils/reg_exp_matcher.dart';
class ImageViewCenter extends ConsumerWidget {
final UChapDataPreload datas;
final bool cropBorders;
final Widget? Function(ExtendedImageState state) loadStateChanged;
final Function(ExtendedImageGestureState state) onDoubleTap;
final GestureConfig Function(ExtendedImageState state)
initGestureConfigHandler;
const ImageViewCenter({
super.key,
required this.datas,
required this.cropBorders,
required this.loadStateChanged,
required this.onDoubleTap,
required this.initGestureConfigHandler,
});
@override
Widget build(BuildContext context, WidgetRef ref) {
return StreamBuilder<Uint8List?>(
stream: ref
.watch(cropBordersProvider(datas: datas, cropBorder: cropBorders)
.future)
.asStream(),
builder: (context, snapshot) {
final hasData = snapshot.hasData && snapshot.data != null;
return _imageView(hasData ? hasData : datas.isLocale!,
hasData ? snapshot.data : datas.archiveImage, ref);
});
}
Widget _imageView(bool isLocale, Uint8List? archiveImage, WidgetRef ref) {
final scaleType = ref.watch(scaleTypeStateProvider);
return isLocale
? archiveImage != null
? ExtendedImage.memory(
archiveImage,
fit: getBoxFit(scaleType),
clearMemoryCacheWhenDispose: true,
enableMemoryCache: false,
mode: ExtendedImageMode.gesture,
initGestureConfigHandler: initGestureConfigHandler,
onDoubleTap: onDoubleTap,
loadStateChanged: loadStateChanged,
)
: ExtendedImage.file(
File("${datas.path!.path}" "${padIndex(datas.index! + 1)}.jpg"),
fit: getBoxFit(scaleType),
clearMemoryCacheWhenDispose: true,
enableMemoryCache: false,
mode: ExtendedImageMode.gesture,
initGestureConfigHandler: initGestureConfigHandler,
onDoubleTap: onDoubleTap,
loadStateChanged: loadStateChanged,
)
: ExtendedImage.network(
datas.url!.trim().trimLeft().trimRight(),
fit: getBoxFit(scaleType),
headers: ref.watch(headersProvider(
source: datas.chapter!.manga.value!.source!,
lang: datas.chapter!.manga.value!.lang!)),
enableMemoryCache: true,
mode: ExtendedImageMode.gesture,
cacheMaxAge: const Duration(days: 7),
initGestureConfigHandler: initGestureConfigHandler,
onDoubleTap: onDoubleTap,
handleLoadingProgress: true,
loadStateChanged: loadStateChanged,
);
}
}