freezer/lib/ui/cached_image.dart

171 lines
4.6 KiB
Dart
Raw Normal View History

2020-06-23 19:23:12 +00:00
import 'package:flutter/material.dart';
import 'package:palette_generator/palette_generator.dart';
import 'package:cached_network_image/cached_network_image.dart';
import 'package:photo_view/photo_view.dart';
2021-07-02 16:28:59 +00:00
import 'package:freezer/translations.i18n.dart';
2020-06-23 19:23:12 +00:00
ImagesDatabase imagesDatabase = ImagesDatabase();
class ImagesDatabase {
/*
!!! Using the wrappers so i don't have to rewrite most of the code, because of migration to cached network image
2020-06-23 19:23:12 +00:00
*/
void saveImage(String url) {
CachedNetworkImageProvider(url);
2020-06-23 19:23:12 +00:00
}
Future<PaletteGenerator> getPaletteGenerator(String url) {
return PaletteGenerator.fromImageProvider(CachedNetworkImageProvider(url));
2020-06-23 19:23:12 +00:00
}
Future<Color> getPrimaryColor(String url) async {
PaletteGenerator paletteGenerator = await getPaletteGenerator(url);
return paletteGenerator.colors.first;
}
Future<bool> isDark(String url) async {
PaletteGenerator paletteGenerator = await getPaletteGenerator(url);
2021-08-29 22:25:18 +00:00
return paletteGenerator.colors.first.computeLuminance() > 0.5
? false
: true;
2020-06-23 19:23:12 +00:00
}
}
class CachedImage extends StatefulWidget {
2021-09-01 12:38:32 +00:00
final String? url;
final double? width;
final double? height;
2020-06-23 19:23:12 +00:00
final bool circular;
final bool fullThumb;
final bool rounded;
2020-06-23 19:23:12 +00:00
2021-08-29 22:25:18 +00:00
const CachedImage(
2021-09-01 12:38:32 +00:00
{Key? key,
2021-08-29 22:25:18 +00:00
this.url,
this.height,
this.width,
this.circular = false,
this.fullThumb = false,
this.rounded = false})
: super(key: key);
2020-06-23 19:23:12 +00:00
@override
_CachedImageState createState() => _CachedImageState();
}
class _CachedImageState extends State<CachedImage> {
@override
Widget build(BuildContext context) {
2021-08-29 22:25:18 +00:00
if (widget.rounded)
return ClipRRect(
borderRadius: BorderRadius.circular(8.0),
child: CachedImage(
url: widget.url,
height: widget.height,
width: widget.width,
circular: false,
rounded: false,
fullThumb: widget.fullThumb),
);
2021-08-29 22:25:18 +00:00
if (widget.circular)
return ClipOval(
child: CachedImage(
url: widget.url,
height: widget.height,
width: widget.width,
circular: false,
rounded: false,
fullThumb: widget.fullThumb,
));
2020-07-16 20:25:30 +00:00
2021-09-01 12:38:32 +00:00
if (!widget.url!.startsWith('http'))
return Image.asset(
2021-09-01 12:38:32 +00:00
widget.url!,
width: widget.width,
height: widget.height,
);
return CachedNetworkImage(
2021-09-01 12:38:32 +00:00
imageUrl: widget.url!,
width: widget.width,
height: widget.height,
placeholder: (context, url) {
2021-08-29 22:25:18 +00:00
if (widget.fullThumb)
return Image.asset(
'assets/cover.jpg',
width: widget.width,
height: widget.height,
);
return Image.asset('assets/cover_thumb.jpg',
width: widget.width, height: widget.height);
},
2021-08-29 22:25:18 +00:00
errorWidget: (context, url, error) => Image.asset(
'assets/cover_thumb.jpg',
width: widget.width,
height: widget.height),
2020-06-23 19:23:12 +00:00
);
}
}
class ZoomableImage extends StatefulWidget {
2021-09-01 12:38:32 +00:00
final String? url;
final bool rounded;
2021-09-01 12:38:32 +00:00
final double? width;
2021-09-01 12:38:32 +00:00
ZoomableImage({required this.url, this.rounded = false, this.width});
@override
_ZoomableImageState createState() => _ZoomableImageState();
}
class _ZoomableImageState extends State<ZoomableImage> {
2021-09-01 12:38:32 +00:00
PhotoViewController? controller;
bool photoViewOpened = false;
@override
void initState() {
super.initState();
2021-08-29 22:25:18 +00:00
controller = PhotoViewController()..outputStateStream.listen(listener);
}
// Listener of PhotoView scale changes. Used for closing PhotoView by pinch-in
void listener(PhotoViewControllerValue value) {
2021-09-01 12:38:32 +00:00
if (value.scale! < 0.16 && photoViewOpened) {
2021-08-29 22:25:18 +00:00
Navigator.pop(context);
photoViewOpened =
false; // to avoid multiple pop() when picture are being scaled out too slowly
}
}
@override
Widget build(BuildContext context) {
2021-08-29 22:25:18 +00:00
return GestureDetector(
child: Semantics(
child: CachedImage(
url: widget.url,
rounded: widget.rounded,
width: widget.width,
fullThumb: true,
),
2021-08-29 22:25:18 +00:00
label: "Album art".i18n,
),
onTap: () {
Navigator.of(context).push(PageRouteBuilder(
opaque: false, // transparent background
pageBuilder: (context, _, __) {
photoViewOpened = true;
return PhotoView(
2021-09-01 12:38:32 +00:00
imageProvider: CachedNetworkImageProvider(widget.url!),
2021-08-29 22:25:18 +00:00
maxScale: 8.0,
minScale: 0.2,
controller: controller,
backgroundDecoration:
BoxDecoration(color: Color.fromARGB(0x90, 0, 0, 0)));
}));
},
);
}
2021-08-29 22:25:18 +00:00
}