ente/lib/ui/collections/album/row_item.dart

129 lines
4.5 KiB
Dart
Raw Normal View History

import 'package:flutter/material.dart';
2023-05-05 10:04:48 +00:00
import "package:intl/intl.dart";
import 'package:photos/db/files_db.dart';
2022-12-15 11:24:51 +00:00
import 'package:photos/models/collection.dart';
import 'package:photos/models/collection_items.dart';
import "package:photos/models/file.dart";
2022-12-15 11:24:51 +00:00
import 'package:photos/models/gallery_type.dart';
import "package:photos/services/collections_service.dart";
2022-10-19 11:16:27 +00:00
import 'package:photos/theme/ente_theme.dart';
import 'package:photos/ui/viewer/file/no_thumbnail_widget.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';
2023-06-06 16:43:32 +00:00
class AlbumRowItemWidget extends StatelessWidget {
final Collection c;
2022-10-19 11:16:27 +00:00
final double sideOfThumbnail;
final bool showFileCount;
2023-06-23 09:53:42 +00:00
final String tagPrefix;
2022-10-19 11:16:27 +00:00
2023-06-06 16:43:32 +00:00
AlbumRowItemWidget(
2022-10-19 11:16:27 +00:00
this.c,
this.sideOfThumbnail, {
this.showFileCount = true,
2023-06-23 09:53:42 +00:00
this.tagPrefix = "collection",
2022-10-19 09:01:14 +00:00
Key? key,
}) : super(key: Key(c.id.toString()));
@override
Widget build(BuildContext context) {
2022-10-19 11:16:27 +00:00
final enteTextTheme = getEnteTextTheme(context);
return GestureDetector(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
2022-11-17 05:32:24 +00:00
Stack(
children: [
ClipRRect(
2022-11-21 12:07:24 +00:00
borderRadius: BorderRadius.circular(1),
2022-11-17 05:32:24 +00:00
child: SizedBox(
height: sideOfThumbnail,
width: sideOfThumbnail,
child: FutureBuilder<File?>(
future: CollectionsService.instance.getCover(c),
builder: (context, snapshot) {
if (snapshot.hasData) {
final thumbnail = snapshot.data!;
final String heroTag = tagPrefix + thumbnail.tag;
return Hero(
tag: heroTag,
child: ThumbnailWidget(
thumbnail,
shouldShowArchiveStatus: c.isArchived(),
showFavForAlbumOnly: true,
2023-06-23 09:53:42 +00:00
shouldShowSyncStatus: false,
key: Key(heroTag),
),
);
} else {
return const NoThumbnailWidget();
}
},
2022-11-17 05:32:24 +00:00
),
),
),
2022-11-17 05:32:24 +00:00
],
),
2023-06-23 07:52:37 +00:00
const SizedBox(height: 4),
SizedBox(
width: sideOfThumbnail,
2023-06-23 09:53:42 +00:00
child: FutureBuilder<int>(
future: showFileCount
? FilesDB.instance.collectionFileCount(c.id)
: Future.value(0),
builder: (context, snapshot) {
if (snapshot.hasData && snapshot.data! > 0) {
final String textCount = NumberFormat().format(snapshot.data);
return Row(
children: [
Container(
constraints: BoxConstraints(
maxWidth:
sideOfThumbnail - ((textCount.length + 3) * 10),
),
child: Text(
c.displayName,
style: enteTextTheme.small,
overflow: TextOverflow.ellipsis,
),
),
RichText(
text: TextSpan(
style: enteTextTheme.smallMuted,
children: [
TextSpan(text: ' \u2022 $textCount'),
],
),
)
],
);
} else {
return Text(
c.displayName,
style: enteTextTheme.small,
overflow: TextOverflow.ellipsis,
);
}
},
),
),
],
),
onTap: () async {
final thumbnail = await CollectionsService.instance.getCover(c);
2022-12-15 11:24:51 +00:00
routeToPage(
context,
CollectionPage(
CollectionWithThumbnail(c, thumbnail),
tagPrefix: tagPrefix,
appBarType: (c.type == CollectionType.favorites
2022-12-15 11:24:51 +00:00
? GalleryType.favorite
: GalleryType.ownedCollection),
),
);
},
);
}
}