diff --git a/lib/models/album.dart b/lib/models/album.dart index 30e2e644e..315dc7fe9 100644 --- a/lib/models/album.dart +++ b/lib/models/album.dart @@ -1,8 +1,10 @@ +import 'package:photos/models/filters/gallery_items_filter.dart'; import 'package:photos/models/photo.dart'; class Album { final String name; final List photos; + final GalleryItemsFilter filter; - Album(this.name, this.photos); + Album(this.name, this.photos, this.filter); } diff --git a/lib/models/filters/favorite_items_filter.dart b/lib/models/filters/favorite_items_filter.dart new file mode 100644 index 000000000..16a471d4a --- /dev/null +++ b/lib/models/filters/favorite_items_filter.dart @@ -0,0 +1,10 @@ +import 'package:photos/favorite_photos_repository.dart'; +import 'package:photos/models/filters/gallery_items_filter.dart'; +import 'package:photos/models/photo.dart'; + +class FavoriteItemsFilter implements GalleryItemsFilter { + @override + bool shouldInclude(Photo photo) { + return FavoritePhotosRepository.instance.isLiked(photo); + } +} diff --git a/lib/models/filters/folder_name_filter.dart b/lib/models/filters/folder_name_filter.dart new file mode 100644 index 000000000..e8f2cfda8 --- /dev/null +++ b/lib/models/filters/folder_name_filter.dart @@ -0,0 +1,14 @@ +import 'package:photos/models/filters/gallery_items_filter.dart'; +import 'package:photos/models/photo.dart'; +import 'package:path/path.dart' as path; + +class FolderNameFilter implements GalleryItemsFilter { + final String folderName; + + FolderNameFilter(this.folderName); + + @override + bool shouldInclude(Photo photo) { + return path.basename(photo.pathName) == folderName; + } +} diff --git a/lib/utils/gallery_items_filter.dart b/lib/models/filters/gallery_items_filter.dart similarity index 100% rename from lib/utils/gallery_items_filter.dart rename to lib/models/filters/gallery_items_filter.dart diff --git a/lib/utils/important_items_filter.dart b/lib/models/filters/important_items_filter.dart similarity index 87% rename from lib/utils/important_items_filter.dart rename to lib/models/filters/important_items_filter.dart index 5b64fdcac..a19aa4e26 100644 --- a/lib/utils/important_items_filter.dart +++ b/lib/models/filters/important_items_filter.dart @@ -1,7 +1,7 @@ import 'dart:io'; +import 'package:photos/models/filters/gallery_items_filter.dart'; import 'package:photos/models/photo.dart'; -import 'package:photos/utils/gallery_items_filter.dart'; import 'package:path/path.dart'; class ImportantItemsFilter implements GalleryItemsFilter { diff --git a/lib/ui/album_list_widget.dart b/lib/ui/album_list_widget.dart index 8555d9fa5..ca09f9367 100644 --- a/lib/ui/album_list_widget.dart +++ b/lib/ui/album_list_widget.dart @@ -4,8 +4,10 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:photos/favorite_photos_repository.dart'; import 'package:photos/models/album.dart'; +import 'package:photos/models/filters/favorite_items_filter.dart'; +import 'package:photos/models/filters/folder_name_filter.dart'; import 'package:photos/models/photo.dart'; -import 'package:photos/ui/album_widget.dart'; +import 'package:photos/ui/album_page.dart'; import 'package:photos/ui/thumbnail_widget.dart'; import 'package:path/path.dart' as path; @@ -42,7 +44,7 @@ class _AlbumListWidgetState extends State { List _getAlbums(List photos) { final albumMap = new LinkedHashMap>(); - final favorites = Album("Favorites", List()); + final favorites = Album("Favorites", List(), FavoriteItemsFilter()); for (Photo photo in photos) { final folder = path.basename(photo.pathName); if (!albumMap.containsKey(folder)) { @@ -59,7 +61,8 @@ class _AlbumListWidgetState extends State { albums.add(favorites); } for (String albumName in albumMap.keys) { - albums.add(Album(albumName, albumMap[albumName])); + albums.add( + Album(albumName, albumMap[albumName], FolderNameFilter(albumName))); } return albums; } diff --git a/lib/ui/album_widget.dart b/lib/ui/album_page.dart similarity index 56% rename from lib/ui/album_widget.dart rename to lib/ui/album_page.dart index 83cc6b496..ddd95ffe5 100644 --- a/lib/ui/album_widget.dart +++ b/lib/ui/album_page.dart @@ -1,6 +1,11 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; +import 'package:photos/core/event_bus.dart'; +import 'package:photos/events/local_photos_updated_event.dart'; import 'package:photos/models/album.dart'; import 'package:photos/models/photo.dart'; +import 'package:photos/photo_repository.dart'; import 'package:photos/ui/gallery.dart'; import 'package:photos/ui/gallery_app_bar_widget.dart'; import 'package:logging/logging.dart'; @@ -17,6 +22,15 @@ class AlbumPage extends StatefulWidget { class _AlbumPageState extends State { final logger = Logger("AlbumPageState"); Set _selectedPhotos = Set(); + StreamSubscription _subscription; + + @override + void initState() { + _subscription = Bus.instance.on().listen((event) { + setState(() {}); + }); + super.initState(); + } @override Widget build(Object context) { @@ -29,18 +43,9 @@ class _AlbumPageState extends State { _selectedPhotos.clear(); }); }, - onPhotosDeleted: (deletedPhotos) { - setState(() { - for (Photo deletedPhoto in deletedPhotos) { - var index = widget.album.photos.indexOf(deletedPhoto); - logger.info("Deleting " + index.toString()); - widget.album.photos.removeAt(index); - } - }); - }, ), body: Gallery( - widget.album.photos, + _getFilteredPhotos(PhotoRepository.instance.photos), _selectedPhotos, photoSelectionChangeCallback: (Set selectedPhotos) { setState(() { @@ -50,4 +55,20 @@ class _AlbumPageState extends State { ), ); } + + List _getFilteredPhotos(List unfilteredPhotos) { + final List filteredPhotos = List(); + for (Photo photo in unfilteredPhotos) { + if (widget.album.filter.shouldInclude(photo)) { + filteredPhotos.add(photo); + } + } + return filteredPhotos; + } + + @override + void dispose() { + _subscription.cancel(); + super.dispose(); + } } diff --git a/lib/ui/gallery_app_bar_widget.dart b/lib/ui/gallery_app_bar_widget.dart index 915707537..0e557bc1d 100644 --- a/lib/ui/gallery_app_bar_widget.dart +++ b/lib/ui/gallery_app_bar_widget.dart @@ -16,10 +16,8 @@ class GalleryAppBarWidget extends StatefulWidget final String title; final Set selectedPhotos; final Function() onSelectionClear; - final Function(List) onPhotosDeleted; - GalleryAppBarWidget(this.title, this.selectedPhotos, - {this.onSelectionClear, this.onPhotosDeleted}); + GalleryAppBarWidget(this.title, this.selectedPhotos, {this.onSelectionClear}); @override _GalleryAppBarWidgetState createState() => _GalleryAppBarWidgetState(); @@ -139,9 +137,6 @@ class _GalleryAppBarWidgetState extends State { } Navigator.of(context, rootNavigator: true).pop(); PhotoRepository.instance.reloadPhotos(); - if (widget.onPhotosDeleted != null) { - widget.onPhotosDeleted(widget.selectedPhotos.toList()); - } _clearSelectedPhotos(); } diff --git a/lib/ui/home_widget.dart b/lib/ui/home_widget.dart index 72712b3f8..5b4e38bea 100644 --- a/lib/ui/home_widget.dart +++ b/lib/ui/home_widget.dart @@ -6,13 +6,13 @@ import 'package:flutter/material.dart'; import 'package:flutter/widgets.dart'; import 'package:photos/core/event_bus.dart'; import 'package:photos/events/local_photos_updated_event.dart'; +import 'package:photos/models/filters/important_items_filter.dart'; import 'package:photos/models/photo.dart'; import 'package:photos/photo_repository.dart'; import 'package:photos/ui/album_list_widget.dart'; import 'package:photos/ui/gallery.dart'; import 'package:photos/ui/gallery_app_bar_widget.dart'; import 'package:photos/ui/loading_widget.dart'; -import 'package:photos/utils/important_items_filter.dart'; import 'package:photos/utils/logging_util.dart'; import 'package:shake/shake.dart'; import 'package:logging/logging.dart';