diff --git a/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart b/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart index 259c40606..769f14f80 100644 --- a/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart +++ b/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart @@ -167,7 +167,7 @@ class _AlbumPickPageState extends State<_AlbumPickPage> { case ChipSetAction.createVault: _createVault(); default: - actionDelegate.onActionSelected(context, {}, action); + actionDelegate.onActionSelected(context, action); } } @@ -282,10 +282,10 @@ class _AlbumChipSetPickActionDelegate extends AlbumChipSetActionDelegate { _AlbumChipSetPickActionDelegate(super.items); @override - void onActionSelected(BuildContext context, Set filters, ChipSetAction action) { + void onActionSelected(BuildContext context, ChipSetAction action) { if (action == ChipSetAction.toggleTitleSearch) { settings.showAlbumPickQuery = !settings.showAlbumPickQuery; } - super.onActionSelected(context, filters, action); + super.onActionSelected(context, action); } } diff --git a/lib/widgets/filter_grids/common/action_delegates/album_set.dart b/lib/widgets/filter_grids/common/action_delegates/album_set.dart index 8f9be79c8..2d9e1611d 100644 --- a/lib/widgets/filter_grids/common/action_delegates/album_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/album_set.dart @@ -141,7 +141,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate with } @override - void onActionSelected(BuildContext context, Set filters, ChipSetAction action) { + void onActionSelected(BuildContext context, ChipSetAction action) { reportService.log('$action'); switch (action) { // general @@ -151,19 +151,19 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate with _createAlbum(context, locked: true); // single/multiple filters case ChipSetAction.delete: - _delete(context, filters); + _delete(context); case ChipSetAction.lockVault: - lockFilters(filters); + lockFilters(getSelectedFilters(context)); browse(context); // single filter case ChipSetAction.rename: - _rename(context, filters.first); + _rename(context); case ChipSetAction.configureVault: - _configureVault(context, filters.first); + _configureVault(context); default: break; } - super.onActionSelected(context, filters, action); + super.onActionSelected(context, action); } @override @@ -259,7 +259,8 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate with showFeedback(context, FeedbackType.info, l10n.genericSuccessFeedback, showAction); } - Future _delete(BuildContext context, Set filters) async { + Future _delete(BuildContext context) async { + final filters = getSelectedFilters(context); final byBinUsage = groupBy(filters, (filter) { final details = vaults.getVault(filter.album); return details?.useBin ?? settings.enableBin; @@ -373,7 +374,11 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate with ); } - Future _rename(BuildContext context, AlbumFilter filter) async { + Future _rename(BuildContext context) async { + final filters = getSelectedFilters(context); + if (filters.isEmpty) return; + + final filter = filters.first; if (!await unlockFilter(context, filter)) return; final album = filter.album; @@ -454,7 +459,11 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate with ); } - Future _configureVault(BuildContext context, AlbumFilter filter) async { + Future _configureVault(BuildContext context) async { + final filters = getSelectedFilters(context); + if (filters.isEmpty) return; + + final filter = filters.first; if (!await unlockFilter(context, filter)) return; final oldDetails = vaults.getVault(filter.album); diff --git a/lib/widgets/filter_grids/common/action_delegates/chip_set.dart b/lib/widgets/filter_grids/common/action_delegates/chip_set.dart index d51281ac8..4bfb43966 100644 --- a/lib/widgets/filter_grids/common/action_delegates/chip_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/chip_set.dart @@ -158,7 +158,7 @@ abstract class ChipSetActionDelegate with FeedbackMi } } - void onActionSelected(BuildContext context, Set filters, ChipSetAction action) { + void onActionSelected(BuildContext context, ChipSetAction action) { reportService.log('$action'); switch (action) { // general @@ -180,19 +180,19 @@ abstract class ChipSetActionDelegate with FeedbackMi break; // browsing or selecting case ChipSetAction.map: - _goToMap(context, filters); + _goToMap(context); case ChipSetAction.slideshow: - _goToSlideshow(context, filters); + _goToSlideshow(context); case ChipSetAction.stats: - _goToStats(context, filters); + _goToStats(context); // selecting (single/multiple filters) case ChipSetAction.hide: - _hide(context, filters); + _hide(context); case ChipSetAction.pin: - settings.pinnedFilters = settings.pinnedFilters..addAll(filters); + settings.pinnedFilters = settings.pinnedFilters..addAll(getSelectedFilters(context)); browse(context); case ChipSetAction.unpin: - settings.pinnedFilters = settings.pinnedFilters..removeAll(filters); + settings.pinnedFilters = settings.pinnedFilters..removeAll(getSelectedFilters(context)); browse(context); case ChipSetAction.delete: case ChipSetAction.lockVault: @@ -200,7 +200,7 @@ abstract class ChipSetActionDelegate with FeedbackMi break; // selecting (single filter) case ChipSetAction.setCover: - _setCover(context, filters.first); + _setCover(context); case ChipSetAction.rename: case ChipSetAction.configureVault: break; @@ -209,9 +209,15 @@ abstract class ChipSetActionDelegate with FeedbackMi void browse(BuildContext context) => context.read>?>()?.browse(); - Iterable _selectedEntries(BuildContext context, Set filters) { + Set getSelectedFilters(BuildContext context) { + final selection = context.read>>(); + return selection.isSelecting ? selection.selectedItems.map((v) => v.filter).toSet() : {}; + } + + Iterable _selectedEntries(BuildContext context) { final source = context.read(); final visibleEntries = source.visibleEntries; + final filters = getSelectedFilters(context); return filters.isEmpty ? visibleEntries : visibleEntries.where((entry) => filters.any((f) => f.test(entry))); } @@ -245,10 +251,10 @@ abstract class ChipSetActionDelegate with FeedbackMi } } - Future _goToMap(BuildContext context, Set filters) async { + Future _goToMap(BuildContext context) async { final mapCollection = CollectionLens( source: context.read(), - fixedSelection: _selectedEntries(context, filters).where((entry) => entry.hasGps).toList(), + fixedSelection: _selectedEntries(context).where((entry) => entry.hasGps).toList(), ); await Navigator.maybeOf(context)?.push( MaterialPageRoute( @@ -258,7 +264,8 @@ abstract class ChipSetActionDelegate with FeedbackMi ); } - void _goToSlideshow(BuildContext context, Set filters) { + void _goToSlideshow(BuildContext context) { + final entries = _selectedEntries(context).toList(); Navigator.maybeOf(context)?.push( MaterialPageRoute( settings: const RouteSettings(name: SlideshowPage.routeName), @@ -266,7 +273,7 @@ abstract class ChipSetActionDelegate with FeedbackMi return SlideshowPage( collection: CollectionLens( source: context.read(), - fixedSelection: _selectedEntries(context, filters).toList(), + fixedSelection: entries, ), ); }, @@ -274,13 +281,14 @@ abstract class ChipSetActionDelegate with FeedbackMi ); } - void _goToStats(BuildContext context, Set filters) { + void _goToStats(BuildContext context) { + final entries = _selectedEntries(context).toSet(); Navigator.maybeOf(context)?.push( MaterialPageRoute( settings: const RouteSettings(name: StatsPage.routeName), builder: (context) { return StatsPage( - entries: _selectedEntries(context, filters).toSet(), + entries: entries, source: context.read(), ); }, @@ -300,7 +308,7 @@ abstract class ChipSetActionDelegate with FeedbackMi ); } - Future _hide(BuildContext context, Set filters) async { + Future _hide(BuildContext context) async { final confirmed = await showDialog( context: context, builder: (context) => AvesDialog( @@ -317,12 +325,17 @@ abstract class ChipSetActionDelegate with FeedbackMi ); if (confirmed == null || !confirmed) return; + final filters = getSelectedFilters(context); settings.changeFilterVisibility(filters, false); browse(context); } - void _setCover(BuildContext context, T filter) async { + void _setCover(BuildContext context) async { + final filters = getSelectedFilters(context); + if (filters.isEmpty) return; + + final filter = filters.first; if (!await unlockFilter(context, filter)) return; final existingCover = covers.of(filter); diff --git a/lib/widgets/filter_grids/common/action_delegates/country_set.dart b/lib/widgets/filter_grids/common/action_delegates/country_set.dart index 669bb67d0..6e72aecd3 100644 --- a/lib/widgets/filter_grids/common/action_delegates/country_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/country_set.dart @@ -80,20 +80,21 @@ class CountryChipSetActionDelegate extends ChipSetActionDelegate } @override - void onActionSelected(BuildContext context, Set filters, ChipSetAction action) { + void onActionSelected(BuildContext context, ChipSetAction action) { reportService.log('$action'); switch (action) { // single/multiple filters case ChipSetAction.showCountryStates: - _showStates(context, filters); + _showStates(context); browse(context); default: break; } - super.onActionSelected(context, filters, action); + super.onActionSelected(context, action); } - void _showStates(BuildContext context, Set filters) { + void _showStates(BuildContext context) { + final filters = getSelectedFilters(context); final countryCodes = filters.map((v) => v.code).where(GeoStates.stateCountryCodes.contains).whereNotNull().toSet(); Navigator.maybeOf(context)?.push( MaterialPageRoute( diff --git a/lib/widgets/filter_grids/common/action_delegates/tag_set.dart b/lib/widgets/filter_grids/common/action_delegates/tag_set.dart index 6c9e2324d..004c2f44c 100644 --- a/lib/widgets/filter_grids/common/action_delegates/tag_set.dart +++ b/lib/widgets/filter_grids/common/action_delegates/tag_set.dart @@ -64,19 +64,21 @@ class TagChipSetActionDelegate extends ChipSetActionDelegate { } @override - void onActionSelected(BuildContext context, Set filters, ChipSetAction action) { + void onActionSelected(BuildContext context, ChipSetAction action) { reportService.log('$action'); switch (action) { // single/multiple filters case ChipSetAction.delete: - _delete(context, filters); + _delete(context); default: break; } - super.onActionSelected(context, filters, action); + super.onActionSelected(context, action); } - Future _delete(BuildContext context, Set filters) async { + Future _delete(BuildContext context) async { + final filters = getSelectedFilters(context); + final source = context.read(); final todoEntries = source.visibleEntries.where((entry) => filters.any((f) => f.test(entry))).toSet(); final todoTags = filters.map((v) => v.tag).toSet(); diff --git a/lib/widgets/filter_grids/common/app_bar.dart b/lib/widgets/filter_grids/common/app_bar.dart index c0a610de0..f39bba04e 100644 --- a/lib/widgets/filter_grids/common/app_bar.dart +++ b/lib/widgets/filter_grids/common/app_bar.dart @@ -437,9 +437,7 @@ class _FilterGridAppBarState actionDelegate) { - final selection = context.read>>(); - final selectedFilters = selection.selectedItems.map((v) => v.filter).toSet(); - actionDelegate.onActionSelected(context, selectedFilters, action); + actionDelegate.onActionSelected(context, action); } void _goToSearch() {