gallery_picker/lib/views/thumbnail_media_file.dart

97 lines
3.2 KiB
Dart
Raw Normal View History

2022-12-25 12:30:20 +03:00
import 'package:flutter/material.dart';
import '../controller/gallery_controller.dart';
2022-12-25 12:30:20 +03:00
import '../models/mode.dart';
import '/models/media_file.dart';
import 'package:transparent_image/transparent_image.dart';
2022-12-29 12:12:06 +03:00
class ThumbnailMediaFile extends StatelessWidget {
2022-12-25 12:30:20 +03:00
final MediaFile file;
final Color failIconColor;
final PhoneGalleryController controller;
final bool isCollapsedSheet;
2022-12-30 05:18:18 +03:00
const ThumbnailMediaFile(
{super.key,
required this.file,
required this.failIconColor,
required this.isCollapsedSheet,
required this.controller});
2022-12-25 12:30:20 +03:00
Color adjustFailedBgColor() {
if (controller.config.mode == Mode.dark) {
2022-12-25 12:30:20 +03:00
return lighten(
controller.config.backgroundColor,
2022-12-25 12:30:20 +03:00
);
} else {
return darken(controller.config.backgroundColor);
2022-12-25 12:30:20 +03:00
}
}
Color darken(Color color, [double amount = .03]) {
assert(amount >= 0 && amount <= 1);
final hsl = HSLColor.fromColor(color);
final hslDark = hsl.withLightness((hsl.lightness - amount).clamp(0.0, 1.0));
return hslDark.toColor();
}
Color lighten(Color color, [double amount = .05]) {
assert(amount >= 0 && amount <= 1);
final hsl = HSLColor.fromColor(color);
final hslLight =
hsl.withLightness((hsl.lightness + amount).clamp(0.0, 1.0));
return hslLight.toColor();
}
@override
Widget build(BuildContext context) {
return FutureBuilder(
future: file.thumbnail == null ? file.getThumbnail() : null,
builder: (context, snapshot) {
return Stack(
fit: StackFit.passthrough,
children: [
if (file.thumbnailFailed)
Container(
color: adjustFailedBgColor(),
child: Icon(
file.isImage
2022-12-25 12:30:20 +03:00
? Icons.image_not_supported
: Icons.videocam_off_rounded,
size: 50,
color: failIconColor,
))
else if (file.thumbnail != null &&
!isCollapsedSheet &&
controller.heroBuilder != null)
2022-12-25 12:30:20 +03:00
Hero(
2022-12-29 08:45:28 +03:00
tag: file.medium.id,
2022-12-25 12:30:20 +03:00
child: FadeInImage(
fadeInDuration: const Duration(milliseconds: 200),
fit: BoxFit.cover,
placeholder: MemoryImage(kTransparentImage),
image: MemoryImage(file.thumbnail!),
),
)
else if (file.thumbnail != null && controller.heroBuilder == null)
FadeInImage(
fadeInDuration: const Duration(milliseconds: 200),
fit: BoxFit.cover,
placeholder: MemoryImage(kTransparentImage),
image: MemoryImage(file.thumbnail!),
)
2022-12-25 12:30:20 +03:00
else
const SizedBox(),
if (file.thumbnail != null && !file.thumbnailFailed)
Positioned(
bottom: 10,
left: 10,
child: Icon(
file.isVideo ? Icons.video_camera_back : null,
2022-12-25 12:30:20 +03:00
color: Colors.white,
size: 20,
)),
],
);
});
}
}