ente/lib/ui/collections/remote_collections_grid_view_widget.dart

70 lines
2.4 KiB
Dart
Raw Normal View History

import 'dart:math';
import 'package:flutter/material.dart';
import 'package:photos/models/collection_items.dart';
2023-06-06 16:43:32 +00:00
import "package:photos/ui/collections/album/row_item.dart";
import 'package:photos/ui/collections/create_new_album_widget.dart';
class RemoteCollectionsGridViewWidget extends StatelessWidget {
2022-10-19 11:16:27 +00:00
/*
Aspect ratio 1:1 Max width 224 Fixed gap 8
Width changes dynamically with screen width such that we can fit 2 in one row.
Keep the width integral (center the albums to distribute excess pixels)
*/
static const maxThumbnailWidth = 224.0;
static const fixedGapBetweenAlbum = 8.0;
static const minGapForHorizontalPadding = 8.0;
static const collectionItemsToPreload = 20;
2022-10-19 11:16:27 +00:00
final List<CollectionWithThumbnail>? collections;
const RemoteCollectionsGridViewWidget(
this.collections, {
Key? key,
}) : super(key: key);
@override
Widget build(BuildContext context) {
2022-10-19 11:16:27 +00:00
final double screenWidth = MediaQuery.of(context).size.width;
final int albumsCountInOneRow = max(screenWidth ~/ maxThumbnailWidth, 2);
final double gapBetweenAlbums =
(albumsCountInOneRow - 1) * fixedGapBetweenAlbum;
// gapOnSizeOfAlbums will be
final double gapOnSizeOfAlbums = minGapForHorizontalPadding +
(screenWidth - gapBetweenAlbums - (2 * minGapForHorizontalPadding)) %
albumsCountInOneRow;
final double sideOfThumbnail =
(screenWidth - gapOnSizeOfAlbums - gapBetweenAlbums) /
albumsCountInOneRow;
return Padding(
2022-11-16 17:01:57 +00:00
padding: const EdgeInsets.symmetric(horizontal: 8),
child: GridView.builder(
shrinkWrap: true,
physics: const ScrollPhysics(),
// to disable GridView's scrolling
itemBuilder: (context, index) {
if (index < collections!.length) {
2023-06-06 16:43:32 +00:00
return AlbumRowItemWidget(
collections![index].collection,
sideOfThumbnail,
shouldRender: index < collectionItemsToPreload,
);
} else {
return const CreateNewAlbumWidget();
}
},
itemCount: collections!.length + 1,
// To include the + button
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: albumsCountInOneRow,
2023-03-07 13:54:26 +00:00
mainAxisSpacing: 12,
2022-10-19 11:16:27 +00:00
crossAxisSpacing: gapBetweenAlbums,
2023-03-07 13:54:26 +00:00
childAspectRatio: sideOfThumbnail / (sideOfThumbnail + 46),
), //24 is height of album title
),
);
}
}