fixed selection for filter actions

This commit is contained in:
Thibault Deckers 2023-12-19 12:36:26 +01:00
parent b54c8824f0
commit cd624979fb
6 changed files with 63 additions and 40 deletions

View file

@ -167,7 +167,7 @@ class _AlbumPickPageState extends State<_AlbumPickPage> {
case ChipSetAction.createVault: case ChipSetAction.createVault:
_createVault(); _createVault();
default: default:
actionDelegate.onActionSelected(context, {}, action); actionDelegate.onActionSelected(context, action);
} }
} }
@ -282,10 +282,10 @@ class _AlbumChipSetPickActionDelegate extends AlbumChipSetActionDelegate {
_AlbumChipSetPickActionDelegate(super.items); _AlbumChipSetPickActionDelegate(super.items);
@override @override
void onActionSelected(BuildContext context, Set<AlbumFilter> filters, ChipSetAction action) { void onActionSelected(BuildContext context, ChipSetAction action) {
if (action == ChipSetAction.toggleTitleSearch) { if (action == ChipSetAction.toggleTitleSearch) {
settings.showAlbumPickQuery = !settings.showAlbumPickQuery; settings.showAlbumPickQuery = !settings.showAlbumPickQuery;
} }
super.onActionSelected(context, filters, action); super.onActionSelected(context, action);
} }
} }

View file

@ -141,7 +141,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> with
} }
@override @override
void onActionSelected(BuildContext context, Set<AlbumFilter> filters, ChipSetAction action) { void onActionSelected(BuildContext context, ChipSetAction action) {
reportService.log('$action'); reportService.log('$action');
switch (action) { switch (action) {
// general // general
@ -151,19 +151,19 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> with
_createAlbum(context, locked: true); _createAlbum(context, locked: true);
// single/multiple filters // single/multiple filters
case ChipSetAction.delete: case ChipSetAction.delete:
_delete(context, filters); _delete(context);
case ChipSetAction.lockVault: case ChipSetAction.lockVault:
lockFilters(filters); lockFilters(getSelectedFilters(context));
browse(context); browse(context);
// single filter // single filter
case ChipSetAction.rename: case ChipSetAction.rename:
_rename(context, filters.first); _rename(context);
case ChipSetAction.configureVault: case ChipSetAction.configureVault:
_configureVault(context, filters.first); _configureVault(context);
default: default:
break; break;
} }
super.onActionSelected(context, filters, action); super.onActionSelected(context, action);
} }
@override @override
@ -259,7 +259,8 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> with
showFeedback(context, FeedbackType.info, l10n.genericSuccessFeedback, showAction); showFeedback(context, FeedbackType.info, l10n.genericSuccessFeedback, showAction);
} }
Future<void> _delete(BuildContext context, Set<AlbumFilter> filters) async { Future<void> _delete(BuildContext context) async {
final filters = getSelectedFilters(context);
final byBinUsage = groupBy<AlbumFilter, bool>(filters, (filter) { final byBinUsage = groupBy<AlbumFilter, bool>(filters, (filter) {
final details = vaults.getVault(filter.album); final details = vaults.getVault(filter.album);
return details?.useBin ?? settings.enableBin; return details?.useBin ?? settings.enableBin;
@ -373,7 +374,11 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> with
); );
} }
Future<void> _rename(BuildContext context, AlbumFilter filter) async { Future<void> _rename(BuildContext context) async {
final filters = getSelectedFilters(context);
if (filters.isEmpty) return;
final filter = filters.first;
if (!await unlockFilter(context, filter)) return; if (!await unlockFilter(context, filter)) return;
final album = filter.album; final album = filter.album;
@ -454,7 +459,11 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> with
); );
} }
Future<void> _configureVault(BuildContext context, AlbumFilter filter) async { Future<void> _configureVault(BuildContext context) async {
final filters = getSelectedFilters(context);
if (filters.isEmpty) return;
final filter = filters.first;
if (!await unlockFilter(context, filter)) return; if (!await unlockFilter(context, filter)) return;
final oldDetails = vaults.getVault(filter.album); final oldDetails = vaults.getVault(filter.album);

View file

@ -158,7 +158,7 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> with FeedbackMi
} }
} }
void onActionSelected(BuildContext context, Set<T> filters, ChipSetAction action) { void onActionSelected(BuildContext context, ChipSetAction action) {
reportService.log('$action'); reportService.log('$action');
switch (action) { switch (action) {
// general // general
@ -180,19 +180,19 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> with FeedbackMi
break; break;
// browsing or selecting // browsing or selecting
case ChipSetAction.map: case ChipSetAction.map:
_goToMap(context, filters); _goToMap(context);
case ChipSetAction.slideshow: case ChipSetAction.slideshow:
_goToSlideshow(context, filters); _goToSlideshow(context);
case ChipSetAction.stats: case ChipSetAction.stats:
_goToStats(context, filters); _goToStats(context);
// selecting (single/multiple filters) // selecting (single/multiple filters)
case ChipSetAction.hide: case ChipSetAction.hide:
_hide(context, filters); _hide(context);
case ChipSetAction.pin: case ChipSetAction.pin:
settings.pinnedFilters = settings.pinnedFilters..addAll(filters); settings.pinnedFilters = settings.pinnedFilters..addAll(getSelectedFilters(context));
browse(context); browse(context);
case ChipSetAction.unpin: case ChipSetAction.unpin:
settings.pinnedFilters = settings.pinnedFilters..removeAll(filters); settings.pinnedFilters = settings.pinnedFilters..removeAll(getSelectedFilters(context));
browse(context); browse(context);
case ChipSetAction.delete: case ChipSetAction.delete:
case ChipSetAction.lockVault: case ChipSetAction.lockVault:
@ -200,7 +200,7 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> with FeedbackMi
break; break;
// selecting (single filter) // selecting (single filter)
case ChipSetAction.setCover: case ChipSetAction.setCover:
_setCover(context, filters.first); _setCover(context);
case ChipSetAction.rename: case ChipSetAction.rename:
case ChipSetAction.configureVault: case ChipSetAction.configureVault:
break; break;
@ -209,9 +209,15 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> with FeedbackMi
void browse(BuildContext context) => context.read<Selection<FilterGridItem<T>>?>()?.browse(); void browse(BuildContext context) => context.read<Selection<FilterGridItem<T>>?>()?.browse();
Iterable<AvesEntry> _selectedEntries(BuildContext context, Set<dynamic> filters) { Set<T> getSelectedFilters(BuildContext context) {
final selection = context.read<Selection<FilterGridItem<T>>>();
return selection.isSelecting ? selection.selectedItems.map((v) => v.filter).toSet() : {};
}
Iterable<AvesEntry> _selectedEntries(BuildContext context) {
final source = context.read<CollectionSource>(); final source = context.read<CollectionSource>();
final visibleEntries = source.visibleEntries; final visibleEntries = source.visibleEntries;
final filters = getSelectedFilters(context);
return filters.isEmpty ? visibleEntries : visibleEntries.where((entry) => filters.any((f) => f.test(entry))); return filters.isEmpty ? visibleEntries : visibleEntries.where((entry) => filters.any((f) => f.test(entry)));
} }
@ -245,10 +251,10 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> with FeedbackMi
} }
} }
Future<void> _goToMap(BuildContext context, Set<T> filters) async { Future<void> _goToMap(BuildContext context) async {
final mapCollection = CollectionLens( final mapCollection = CollectionLens(
source: context.read<CollectionSource>(), source: context.read<CollectionSource>(),
fixedSelection: _selectedEntries(context, filters).where((entry) => entry.hasGps).toList(), fixedSelection: _selectedEntries(context).where((entry) => entry.hasGps).toList(),
); );
await Navigator.maybeOf(context)?.push( await Navigator.maybeOf(context)?.push(
MaterialPageRoute( MaterialPageRoute(
@ -258,7 +264,8 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> with FeedbackMi
); );
} }
void _goToSlideshow(BuildContext context, Set<T> filters) { void _goToSlideshow(BuildContext context) {
final entries = _selectedEntries(context).toList();
Navigator.maybeOf(context)?.push( Navigator.maybeOf(context)?.push(
MaterialPageRoute( MaterialPageRoute(
settings: const RouteSettings(name: SlideshowPage.routeName), settings: const RouteSettings(name: SlideshowPage.routeName),
@ -266,7 +273,7 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> with FeedbackMi
return SlideshowPage( return SlideshowPage(
collection: CollectionLens( collection: CollectionLens(
source: context.read<CollectionSource>(), source: context.read<CollectionSource>(),
fixedSelection: _selectedEntries(context, filters).toList(), fixedSelection: entries,
), ),
); );
}, },
@ -274,13 +281,14 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> with FeedbackMi
); );
} }
void _goToStats(BuildContext context, Set<T> filters) { void _goToStats(BuildContext context) {
final entries = _selectedEntries(context).toSet();
Navigator.maybeOf(context)?.push( Navigator.maybeOf(context)?.push(
MaterialPageRoute( MaterialPageRoute(
settings: const RouteSettings(name: StatsPage.routeName), settings: const RouteSettings(name: StatsPage.routeName),
builder: (context) { builder: (context) {
return StatsPage( return StatsPage(
entries: _selectedEntries(context, filters).toSet(), entries: entries,
source: context.read<CollectionSource>(), source: context.read<CollectionSource>(),
); );
}, },
@ -300,7 +308,7 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> with FeedbackMi
); );
} }
Future<void> _hide(BuildContext context, Set<T> filters) async { Future<void> _hide(BuildContext context) async {
final confirmed = await showDialog<bool>( final confirmed = await showDialog<bool>(
context: context, context: context,
builder: (context) => AvesDialog( builder: (context) => AvesDialog(
@ -317,12 +325,17 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> with FeedbackMi
); );
if (confirmed == null || !confirmed) return; if (confirmed == null || !confirmed) return;
final filters = getSelectedFilters(context);
settings.changeFilterVisibility(filters, false); settings.changeFilterVisibility(filters, false);
browse(context); 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; if (!await unlockFilter(context, filter)) return;
final existingCover = covers.of(filter); final existingCover = covers.of(filter);

View file

@ -80,20 +80,21 @@ class CountryChipSetActionDelegate extends ChipSetActionDelegate<LocationFilter>
} }
@override @override
void onActionSelected(BuildContext context, Set<LocationFilter> filters, ChipSetAction action) { void onActionSelected(BuildContext context, ChipSetAction action) {
reportService.log('$action'); reportService.log('$action');
switch (action) { switch (action) {
// single/multiple filters // single/multiple filters
case ChipSetAction.showCountryStates: case ChipSetAction.showCountryStates:
_showStates(context, filters); _showStates(context);
browse(context); browse(context);
default: default:
break; break;
} }
super.onActionSelected(context, filters, action); super.onActionSelected(context, action);
} }
void _showStates(BuildContext context, Set<LocationFilter> filters) { void _showStates(BuildContext context) {
final filters = getSelectedFilters(context);
final countryCodes = filters.map((v) => v.code).where(GeoStates.stateCountryCodes.contains).whereNotNull().toSet(); final countryCodes = filters.map((v) => v.code).where(GeoStates.stateCountryCodes.contains).whereNotNull().toSet();
Navigator.maybeOf(context)?.push( Navigator.maybeOf(context)?.push(
MaterialPageRoute( MaterialPageRoute(

View file

@ -64,19 +64,21 @@ class TagChipSetActionDelegate extends ChipSetActionDelegate<TagFilter> {
} }
@override @override
void onActionSelected(BuildContext context, Set<TagFilter> filters, ChipSetAction action) { void onActionSelected(BuildContext context, ChipSetAction action) {
reportService.log('$action'); reportService.log('$action');
switch (action) { switch (action) {
// single/multiple filters // single/multiple filters
case ChipSetAction.delete: case ChipSetAction.delete:
_delete(context, filters); _delete(context);
default: default:
break; break;
} }
super.onActionSelected(context, filters, action); super.onActionSelected(context, action);
} }
Future<void> _delete(BuildContext context, Set<TagFilter> filters) async { Future<void> _delete(BuildContext context) async {
final filters = getSelectedFilters(context);
final source = context.read<CollectionSource>(); final source = context.read<CollectionSource>();
final todoEntries = source.visibleEntries.where((entry) => filters.any((f) => f.test(entry))).toSet(); final todoEntries = source.visibleEntries.where((entry) => filters.any((f) => f.test(entry))).toSet();
final todoTags = filters.map((v) => v.tag).toSet(); final todoTags = filters.map((v) => v.tag).toSet();

View file

@ -437,9 +437,7 @@ class _FilterGridAppBarState<T extends CollectionFilter, CSAD extends ChipSetAct
} }
void _onActionSelected(BuildContext context, ChipSetAction action, ChipSetActionDelegate<T> actionDelegate) { void _onActionSelected(BuildContext context, ChipSetAction action, ChipSetActionDelegate<T> actionDelegate) {
final selection = context.read<Selection<FilterGridItem<T>>>(); actionDelegate.onActionSelected(context, action);
final selectedFilters = selection.selectedItems.map((v) => v.filter).toSet();
actionDelegate.onActionSelected(context, selectedFilters, action);
} }
void _goToSearch() { void _goToSearch() {