ente/lib/ui/collections/collection_item_widget.dart

155 lines
4.7 KiB
Dart
Raw Normal View History

import 'package:flutter/material.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';
2022-12-15 11:24:51 +00:00
import 'package:photos/models/gallery_type.dart';
2022-10-19 11:16:27 +00:00
import 'package:photos/theme/ente_theme.dart';
2023-01-17 08:30:33 +00:00
import 'package:photos/ui/viewer/file/file_icons_widget.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';
import 'package:visibility_detector/visibility_detector.dart';
class CollectionItem extends StatelessWidget {
2022-10-19 09:01:14 +00:00
final CollectionWithThumbnail c;
2022-10-19 11:16:27 +00:00
final double sideOfThumbnail;
final bool shouldRender;
2022-10-19 11:16:27 +00:00
CollectionItem(
2022-10-19 11:16:27 +00:00
this.c,
this.sideOfThumbnail, {
this.shouldRender = false,
2022-10-19 09:01:14 +00:00
Key? key,
}) : super(key: Key(c.collection.id.toString()));
@override
Widget build(BuildContext context) {
2022-10-19 11:16:27 +00:00
final enteColorScheme = getEnteColorScheme(context);
final enteTextTheme = getEnteTextTheme(context);
2022-10-19 09:01:14 +00:00
final String heroTag =
"collection" + (c.thumbnail?.tag ?? c.collection.id.toString());
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: Hero(
tag: heroTag,
child: c.thumbnail != null
? CollectionItemThumbnailWidget(
c: c,
heroTag: heroTag,
shouldRender: shouldRender,
2022-11-17 05:32:24 +00:00
)
: const NoThumbnailWidget(),
),
),
),
2022-11-17 05:32:24 +00:00
],
),
2022-10-19 11:16:27 +00:00
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
2022-11-21 12:07:24 +00:00
const SizedBox(height: 2),
2022-10-19 11:16:27 +00:00
Text(
(c.collection.name ?? "Unnamed").trim(),
2022-10-19 11:16:27 +00:00
style: enteTextTheme.small,
overflow: TextOverflow.ellipsis,
),
FutureBuilder<int>(
future: FilesDB.instance.collectionFileCount(c.collection.id),
builder: (context, snapshot) {
if (snapshot.hasData) {
2022-10-19 11:16:27 +00:00
return Text(
snapshot.data.toString(),
style: enteTextTheme.small.copyWith(
color: enteColorScheme.textMuted,
),
);
} else {
2022-10-19 11:16:27 +00:00
return Text(
"",
style: enteTextTheme.small.copyWith(
color: enteColorScheme.textMuted,
),
);
}
},
),
],
),
],
),
onTap: () {
2022-12-15 11:24:51 +00:00
routeToPage(
context,
CollectionPage(
c,
appBarType: (c.collection.type == CollectionType.favorites
? GalleryType.favorite
: GalleryType.ownedCollection),
),
);
},
);
}
}
class CollectionItemThumbnailWidget extends StatefulWidget {
const CollectionItemThumbnailWidget({
Key? key,
required this.c,
required this.heroTag,
this.shouldRender = false,
}) : super(key: key);
final CollectionWithThumbnail c;
final String heroTag;
final bool shouldRender;
@override
State<CollectionItemThumbnailWidget> createState() =>
_CollectionItemThumbnailWidgetState();
}
class _CollectionItemThumbnailWidgetState
extends State<CollectionItemThumbnailWidget> {
bool _shouldRender = false;
@override
void initState() {
super.initState();
_shouldRender = widget.shouldRender;
}
@override
Widget build(BuildContext context) {
return VisibilityDetector(
key: Key("collection_item" + widget.c.thumbnail!.tag),
onVisibilityChanged: (visibility) {
final shouldRender = visibility.visibleFraction > 0;
if (mounted && shouldRender && !_shouldRender) {
setState(() {
_shouldRender = shouldRender;
});
}
},
child: _shouldRender
? ThumbnailWidget(
widget.c.thumbnail,
shouldShowArchiveStatus: widget.c.collection.isArchived(),
showFavForAlbumOnly: true,
key: Key(widget.heroTag),
)
2023-01-17 08:30:33 +00:00
: const ThumbnailPlaceHolder(),
);
}
}