ente/lib/ui/album_list_widget.dart

91 lines
2.4 KiB
Dart
Raw Normal View History

2020-04-18 18:46:38 +00:00
import 'dart:collection';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
2020-05-01 18:20:12 +00:00
import 'package:photos/models/album.dart';
import 'package:photos/models/photo.dart';
import 'package:photos/ui/album_widget.dart';
import 'package:photos/ui/thumbnail_widget.dart';
2020-04-21 11:48:56 +00:00
import 'package:path/path.dart' as path;
2020-04-18 18:46:38 +00:00
class AlbumListWidget extends StatefulWidget {
final List<Photo> photos;
const AlbumListWidget(this.photos, {Key key}) : super(key: key);
@override
_AlbumListWidgetState createState() => _AlbumListWidgetState();
}
class _AlbumListWidgetState extends State<AlbumListWidget> {
@override
Widget build(BuildContext context) {
List<Album> albums = _getAlbums(widget.photos);
return Container(
margin: EdgeInsets.only(top: 24),
child: GridView.builder(
shrinkWrap: true,
padding: EdgeInsets.only(bottom: 12),
physics: ScrollPhysics(), // to disable GridView's scrolling
itemBuilder: (context, index) {
return _buildAlbum(context, albums[index]);
},
itemCount: albums.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
),
),
);
}
List<Album> _getAlbums(List<Photo> photos) {
final albumMap = new LinkedHashMap<String, List<Photo>>();
for (Photo photo in photos) {
2020-04-24 12:40:24 +00:00
final folder = path.basename(photo.pathName);
2020-04-18 18:46:38 +00:00
if (!albumMap.containsKey(folder)) {
albumMap[folder] = new List<Photo>();
}
albumMap[folder].add(photo);
}
List<Album> albums = new List<Album>();
for (String albumName in albumMap.keys) {
albums.add(Album(albumName, albumMap[albumName]));
}
return albums;
}
Widget _buildAlbum(BuildContext context, Album album) {
return GestureDetector(
child: Column(
children: <Widget>[
2020-04-25 10:42:27 +00:00
Container(
child: ThumbnailWidget(album.photos[0]),
height: 150,
width: 150,
),
2020-04-18 18:46:38 +00:00
Padding(padding: EdgeInsets.all(2)),
Expanded(
child: Text(
album.name,
style: TextStyle(
fontSize: 16,
),
),
),
],
),
onTap: () {
final page = AlbumPage(album);
Navigator.of(context).push(
MaterialPageRoute(
builder: (BuildContext context) {
return page;
},
),
);
},
);
}
}