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:
_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<AlbumFilter> 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);
}
}

View file

@ -141,7 +141,7 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> with
}
@override
void onActionSelected(BuildContext context, Set<AlbumFilter> filters, ChipSetAction action) {
void onActionSelected(BuildContext context, ChipSetAction action) {
reportService.log('$action');
switch (action) {
// general
@ -151,19 +151,19 @@ class AlbumChipSetActionDelegate extends ChipSetActionDelegate<AlbumFilter> 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<AlbumFilter> with
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 details = vaults.getVault(filter.album);
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;
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;
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');
switch (action) {
// general
@ -180,19 +180,19 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> 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<T extends CollectionFilter> 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<T extends CollectionFilter> with FeedbackMi
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 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<T extends CollectionFilter> with FeedbackMi
}
}
Future<void> _goToMap(BuildContext context, Set<T> filters) async {
Future<void> _goToMap(BuildContext context) async {
final mapCollection = CollectionLens(
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(
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(
MaterialPageRoute(
settings: const RouteSettings(name: SlideshowPage.routeName),
@ -266,7 +273,7 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> with FeedbackMi
return SlideshowPage(
collection: CollectionLens(
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(
MaterialPageRoute(
settings: const RouteSettings(name: StatsPage.routeName),
builder: (context) {
return StatsPage(
entries: _selectedEntries(context, filters).toSet(),
entries: entries,
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>(
context: context,
builder: (context) => AvesDialog(
@ -317,12 +325,17 @@ abstract class ChipSetActionDelegate<T extends CollectionFilter> 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);

View file

@ -80,20 +80,21 @@ class CountryChipSetActionDelegate extends ChipSetActionDelegate<LocationFilter>
}
@override
void onActionSelected(BuildContext context, Set<LocationFilter> 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<LocationFilter> 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(

View file

@ -64,19 +64,21 @@ class TagChipSetActionDelegate extends ChipSetActionDelegate<TagFilter> {
}
@override
void onActionSelected(BuildContext context, Set<TagFilter> 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<void> _delete(BuildContext context, Set<TagFilter> filters) async {
Future<void> _delete(BuildContext context) async {
final filters = getSelectedFilters(context);
final source = context.read<CollectionSource>();
final todoEntries = source.visibleEntries.where((entry) => filters.any((f) => f.test(entry))).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) {
final selection = context.read<Selection<FilterGridItem<T>>>();
final selectedFilters = selection.selectedItems.map((v) => v.filter).toSet();
actionDelegate.onActionSelected(context, selectedFilters, action);
actionDelegate.onActionSelected(context, action);
}
void _goToSearch() {