92 lines
3.1 KiB
Dart
92 lines
3.1 KiB
Dart
|
import 'dart:math';
|
||
|
|
||
|
import 'package:flutter/material.dart';
|
||
|
import 'package:photos/db/files_db.dart';
|
||
|
import 'package:photos/models/collection_items.dart';
|
||
|
import 'package:photos/ui/viewer/file/thumbnail_widget.dart';
|
||
|
import 'package:photos/ui/viewer/gallery/collection_page.dart';
|
||
|
import 'package:photos/utils/navigation_util.dart';
|
||
|
|
||
|
class CollectionItem extends StatelessWidget {
|
||
|
CollectionItem(
|
||
|
this.c, {
|
||
|
Key key,
|
||
|
}) : super(key: Key(c.collection.id.toString()));
|
||
|
|
||
|
final CollectionWithThumbnail c;
|
||
|
|
||
|
@override
|
||
|
Widget build(BuildContext context) {
|
||
|
const double horizontalPaddingOfGridRow = 16;
|
||
|
const double crossAxisSpacingOfGrid = 9;
|
||
|
Size size = MediaQuery.of(context).size;
|
||
|
int albumsCountInOneRow = max(size.width ~/ 220.0, 2);
|
||
|
double totalWhiteSpaceOfRow = (horizontalPaddingOfGridRow * 2) +
|
||
|
(albumsCountInOneRow - 1) * crossAxisSpacingOfGrid;
|
||
|
TextStyle albumTitleTextStyle =
|
||
|
Theme.of(context).textTheme.subtitle1.copyWith(fontSize: 14);
|
||
|
final double sideOfThumbnail = (size.width / albumsCountInOneRow) -
|
||
|
(totalWhiteSpaceOfRow / albumsCountInOneRow);
|
||
|
return GestureDetector(
|
||
|
child: Column(
|
||
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||
|
children: <Widget>[
|
||
|
ClipRRect(
|
||
|
borderRadius: BorderRadius.circular(4),
|
||
|
child: SizedBox(
|
||
|
height: sideOfThumbnail,
|
||
|
width: sideOfThumbnail,
|
||
|
child: Hero(
|
||
|
tag: "collection" + c.thumbnail.tag(),
|
||
|
child: ThumbnailWidget(
|
||
|
c.thumbnail,
|
||
|
shouldShowArchiveStatus: c.collection.isArchived(),
|
||
|
key: Key(
|
||
|
"collection" + c.thumbnail.tag(),
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
),
|
||
|
const SizedBox(height: 4),
|
||
|
Row(
|
||
|
children: [
|
||
|
Container(
|
||
|
constraints: BoxConstraints(maxWidth: sideOfThumbnail - 40),
|
||
|
child: Text(
|
||
|
c.collection.name,
|
||
|
style: albumTitleTextStyle,
|
||
|
overflow: TextOverflow.ellipsis,
|
||
|
),
|
||
|
),
|
||
|
FutureBuilder<int>(
|
||
|
future: FilesDB.instance.collectionFileCount(c.collection.id),
|
||
|
builder: (context, snapshot) {
|
||
|
if (snapshot.hasData && snapshot.data > 0) {
|
||
|
return RichText(
|
||
|
text: TextSpan(
|
||
|
style: albumTitleTextStyle.copyWith(
|
||
|
color: albumTitleTextStyle.color.withOpacity(0.5),
|
||
|
),
|
||
|
children: [
|
||
|
const TextSpan(text: " \u2022 "),
|
||
|
TextSpan(text: snapshot.data.toString()),
|
||
|
],
|
||
|
),
|
||
|
);
|
||
|
} else {
|
||
|
return const SizedBox.shrink();
|
||
|
}
|
||
|
},
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
],
|
||
|
),
|
||
|
onTap: () {
|
||
|
routeToPage(context, CollectionPage(c));
|
||
|
},
|
||
|
);
|
||
|
}
|
||
|
}
|