fixed selection for filter actions
This commit is contained in:
parent
b54c8824f0
commit
cd624979fb
6 changed files with 63 additions and 40 deletions
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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(
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Reference in a new issue