mc_gallery/lib/features/home/views/gallery/downloaded_gallery_view.dart

123 lines
3.9 KiB
Dart

part of 'gallery_view.dart';
class _DownloadedGalleryView extends StatelessWidget {
const _DownloadedGalleryView({
required this.galleryViewModel,
super.key,
});
final GalleryViewModel galleryViewModel;
@override
Widget build(BuildContext context) {
return DecoratedBox(
decoration: const BoxDecoration(color: ConstColours.galleryBackgroundColour),
child: Padding(
padding: const EdgeInsets.all(8),
// Using Wrap instead of GridView, to make use of different image sizes
child: ValueListenableBuilder<bool>(
valueListenable: galleryViewModel.isViewingFavouriteListenable,
builder: (context, final isViewingFavourites, _) => !isViewingFavourites
? Wrap(
runSpacing: 24,
spacing: 8,
alignment: WrapAlignment.center,
runAlignment: WrapAlignment.center,
crossAxisAlignment: WrapCrossAlignment.center,
children: [
for (final imageModel in galleryViewModel.imageModels)
_StarrableImage(
key: ValueKey(imageModel.imageIndex),
imageModel: imageModel,
galleryViewModel: galleryViewModel,
),
],
)
: Wrap(
runSpacing: 24,
spacing: 8,
alignment: WrapAlignment.center,
runAlignment: WrapAlignment.center,
crossAxisAlignment: WrapCrossAlignment.center,
children: [
for (final favouriteImageModel in galleryViewModel.favouriteImageModels)
_StarrableImage(
key: ValueKey(favouriteImageModel.imageIndex),
imageModel: favouriteImageModel,
galleryViewModel: galleryViewModel,
),
],
),
),
),
);
}
}
class _StarrableImage extends StatefulWidget {
const _StarrableImage({
required this.galleryViewModel,
required this.imageModel,
super.key,
});
final GalleryViewModel galleryViewModel;
final ImageModel imageModel;
@override
State<_StarrableImage> createState() => _StarrableImageState();
}
class _StarrableImageState extends State<_StarrableImage> {
late bool isMarkedFavourite;
@override
void initState() {
super.initState();
isMarkedFavourite = widget.imageModel.isFavourite;
}
@override
Widget build(BuildContext context) {
return Stack(
alignment: Alignment.topRight.add(const Alignment(0.2, -0.2)),
children: [
GestureDetector(
onTap: () => widget.galleryViewModel.pushImageCarouselView(
context,
imageModel: widget.imageModel,
),
child: CachedNetworkImage(
imageUrl: widget.imageModel.uri.toString(),
cacheKey: widget.imageModel.imageIndex.toString(),
progressIndicatorBuilder: (_, __, final progress) => CircularProgressIndicator(
value: widget.galleryViewModel.downloadProgressValue(progress: progress),
),
),
),
GestureDetector(
child: isMarkedFavourite
? ConstMedia.buildIcon(
ConstMedia.favStarFilled,
width: 16,
height: 16,
)
: ConstMedia.buildIcon(
ConstMedia.favStarOutline,
width: 16,
height: 16,
),
onTap: () {
widget.galleryViewModel.updateImageFavouriteStatus(
imageModel: widget.imageModel,
newFavouriteStatus: !isMarkedFavourite,
);
setState(() => isMarkedFavourite = !isMarkedFavourite);
},
),
],
);
}
}