From 71e9e07668d8264fa6c7394034b5c99dd9fa5d17 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Mon, 8 Apr 2024 22:51:15 +0200 Subject: [PATCH] #967 pick collection with removable contextual filters to edit date/location --- lib/app_mode.dart | 6 +++-- lib/widgets/aves_app.dart | 9 +------- lib/widgets/collection/app_bar.dart | 4 ++-- lib/widgets/collection/collection_grid.dart | 2 +- lib/widgets/collection/collection_page.dart | 10 +-------- lib/widgets/collection/grid/tile.dart | 3 ++- lib/widgets/dialogs/add_shortcut_dialog.dart | 1 + .../entry_editors/edit_date_dialog.dart | 20 ++++++++++++----- .../entry_editors/edit_location_dialog.dart | 22 +++++++++++-------- .../cover_selection_dialog.dart | 1 + .../dialogs/pick_dialogs/item_pick_page.dart | 5 ++++- .../filter_grids/common/filter_tile.dart | 8 +------ lib/widgets/home_page.dart | 11 ++-------- 13 files changed, 48 insertions(+), 54 deletions(-) diff --git a/lib/app_mode.dart b/lib/app_mode.dart index 8135170b4..478afd8b9 100644 --- a/lib/app_mode.dart +++ b/lib/app_mode.dart @@ -3,7 +3,8 @@ enum AppMode { pickCollectionFiltersExternal, pickSingleMediaExternal, pickMultipleMediaExternal, - pickMediaInternal, + pickFilteredMediaInternal, + pickUnfilteredMediaInternal, pickFilterInternal, screenSaver, setWallpaper, @@ -40,6 +41,7 @@ extension ExtraAppMode on AppMode { bool get isPickingMedia => { AppMode.pickSingleMediaExternal, AppMode.pickMultipleMediaExternal, - AppMode.pickMediaInternal, + AppMode.pickFilteredMediaInternal, + AppMode.pickUnfilteredMediaInternal, }.contains(this); } diff --git a/lib/widgets/aves_app.dart b/lib/widgets/aves_app.dart index fce1cb80d..159eb6d05 100644 --- a/lib/widgets/aves_app.dart +++ b/lib/widgets/aves_app.dart @@ -385,14 +385,7 @@ class _AvesAppState extends State with WidgetsBindingObserver { case AppMode.pickMultipleMediaExternal: _saveTopEntries(); break; - case AppMode.pickCollectionFiltersExternal: - case AppMode.pickMediaInternal: - case AppMode.pickFilterInternal: - case AppMode.screenSaver: - case AppMode.setWallpaper: - case AppMode.slideshow: - case AppMode.view: - case AppMode.edit: + default: break; } case AppLifecycleState.resumed: diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index 2fb992ffe..20aa7c3d8 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -163,7 +163,7 @@ class _CollectionAppBarState extends State with SingleTickerPr child: AnimatedBuilder( animation: collection.filterChangeNotifier, builder: (context, child) { - final removableFilters = appMode != AppMode.pickMediaInternal; + final canRemoveFilters = appMode != AppMode.pickFilteredMediaInternal; return Selector( selector: (context, query) => query.enabled, builder: (context, queryEnabled, child) { @@ -172,7 +172,7 @@ class _CollectionAppBarState extends State with SingleTickerPr builder: (context, _, child) { final useTvLayout = settings.useTvLayout; final actions = _buildActions(context, selection); - final onFilterTap = removableFilters ? collection.removeFilter : null; + final onFilterTap = canRemoveFilters ? collection.removeFilter : null; return AvesAppBar( contentHeight: appBarContentHeight, pinned: context.select, bool>((selection) => selection.isSelecting), diff --git a/lib/widgets/collection/collection_grid.dart b/lib/widgets/collection/collection_grid.dart index 92814439e..6a1fcf042 100644 --- a/lib/widgets/collection/collection_grid.dart +++ b/lib/widgets/collection/collection_grid.dart @@ -251,7 +251,7 @@ class _CollectionGridContentState extends State<_CollectionGridContent> { if (selection.isSelecting) { child = MultiProvider( providers: [ - ListenableProvider>.value(value: ValueNotifier(AppMode.pickMediaInternal)), + ListenableProvider>.value(value: ValueNotifier(AppMode.pickFilteredMediaInternal)), ChangeNotifierProvider>.value(value: selection), ], child: child, diff --git a/lib/widgets/collection/collection_page.dart b/lib/widgets/collection/collection_page.dart index 867d73e73..e2b263cb2 100644 --- a/lib/widgets/collection/collection_page.dart +++ b/lib/widgets/collection/collection_page.dart @@ -201,15 +201,7 @@ class _CollectionPageState extends State { IntentService.submitPickedCollectionFilters(filters); }, ); - case AppMode.main: - case AppMode.pickSingleMediaExternal: - case AppMode.pickMediaInternal: - case AppMode.pickFilterInternal: - case AppMode.screenSaver: - case AppMode.setWallpaper: - case AppMode.slideshow: - case AppMode.view: - case AppMode.edit: + default: return null; } } diff --git a/lib/widgets/collection/grid/tile.dart b/lib/widgets/collection/grid/tile.dart index 2a8cc56fc..554c9cb9a 100644 --- a/lib/widgets/collection/grid/tile.dart +++ b/lib/widgets/collection/grid/tile.dart @@ -46,7 +46,8 @@ class InteractiveTile extends StatelessWidget { case AppMode.pickMultipleMediaExternal: final selection = context.read>(); selection.toggleSelection(entry); - case AppMode.pickMediaInternal: + case AppMode.pickFilteredMediaInternal: + case AppMode.pickUnfilteredMediaInternal: Navigator.maybeOf(context)?.pop(entry); case AppMode.pickCollectionFiltersExternal: case AppMode.pickFilterInternal: diff --git a/lib/widgets/dialogs/add_shortcut_dialog.dart b/lib/widgets/dialogs/add_shortcut_dialog.dart index 88af929c3..461e79a18 100644 --- a/lib/widgets/dialogs/add_shortcut_dialog.dart +++ b/lib/widgets/dialogs/add_shortcut_dialog.dart @@ -124,6 +124,7 @@ class _AddShortcutDialogState extends State { source: _collection.source, filters: pickFilters, ), + canRemoveFilters: false, ); }, fullscreenDialog: true, diff --git a/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart index f469acdeb..8a0bb0384 100644 --- a/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/edit_date_dialog.dart @@ -322,21 +322,31 @@ class _EditEntryDateDialogState extends State { )); } + CollectionLens? _createPickCollection() { + final baseCollection = widget.collection; + return baseCollection != null + ? CollectionLens( + source: baseCollection.source, + filters: baseCollection.filters, + ) + : null; + } + Future _pickCopyItemSource() async { - final _collection = widget.collection; - if (_collection == null) return; + final pickCollection = _createPickCollection(); + if (pickCollection == null) return; final entry = await Navigator.maybeOf(context)?.push( MaterialPageRoute( settings: const RouteSettings(name: ItemPickPage.routeName), builder: (context) => ItemPickPage( - collection: CollectionLens( - source: _collection.source, - ), + collection: pickCollection, + canRemoveFilters: true, ), fullscreenDialog: true, ), ); + pickCollection.dispose(); if (entry != null) { setState(() => _copyItemSource = entry); } diff --git a/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart b/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart index d9c946760..ca73fa477 100644 --- a/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart +++ b/lib/widgets/dialogs/entry_editors/edit_location_dialog.dart @@ -169,9 +169,9 @@ class _EditEntryLocationDialogState extends State { ); } - Future _pickLocation() async { + CollectionLens? _createPickCollection() { final baseCollection = widget.collection; - final mapCollection = baseCollection != null + return baseCollection != null ? CollectionLens( source: baseCollection.source, filters: { @@ -180,17 +180,21 @@ class _EditEntryLocationDialogState extends State { }, ) : null; + } + + Future _pickLocation() async { + final pickCollection = _createPickCollection(); final latLng = await Navigator.maybeOf(context)?.push( MaterialPageRoute( settings: const RouteSettings(name: LocationPickPage.routeName), builder: (context) => LocationPickPage( - collection: mapCollection, + collection: pickCollection, initialLocation: _mapCoordinates, ), fullscreenDialog: true, ), ); - mapCollection?.dispose(); + pickCollection?.dispose(); if (latLng != null) { settings.mapDefaultCenter = latLng; setState(() { @@ -218,20 +222,20 @@ class _EditEntryLocationDialogState extends State { } Future _pickCopyItemSource() async { - final _collection = widget.collection; - if (_collection == null) return; + final pickCollection = _createPickCollection(); + if (pickCollection == null) return; final entry = await Navigator.maybeOf(context)?.push( MaterialPageRoute( settings: const RouteSettings(name: ItemPickPage.routeName), builder: (context) => ItemPickPage( - collection: CollectionLens( - source: _collection.source, - ), + collection: pickCollection, + canRemoveFilters: true, ), fullscreenDialog: true, ), ); + pickCollection.dispose(); if (entry != null) { setState(() { _copyItemSource = entry; diff --git a/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart b/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart index 213c177f5..02f4dd6a7 100644 --- a/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart +++ b/lib/widgets/dialogs/filter_editors/cover_selection_dialog.dart @@ -344,6 +344,7 @@ class _CoverSelectionDialogState extends State { source: context.read(), filters: {filter}, ), + canRemoveFilters: false, ), fullscreenDialog: true, ), diff --git a/lib/widgets/dialogs/pick_dialogs/item_pick_page.dart b/lib/widgets/dialogs/pick_dialogs/item_pick_page.dart index 4631a2b94..490f5edb7 100644 --- a/lib/widgets/dialogs/pick_dialogs/item_pick_page.dart +++ b/lib/widgets/dialogs/pick_dialogs/item_pick_page.dart @@ -16,10 +16,12 @@ class ItemPickPage extends StatefulWidget { static const routeName = '/item_pick'; final CollectionLens collection; + final bool canRemoveFilters; const ItemPickPage({ super.key, required this.collection, + required this.canRemoveFilters, }); @override @@ -38,8 +40,9 @@ class _ItemPickPageState extends State { @override Widget build(BuildContext context) { final liveFilter = collection.filters.firstWhereOrNull((v) => v is QueryFilter && v.live) as QueryFilter?; + final mode = widget.canRemoveFilters ? AppMode.pickUnfilteredMediaInternal : AppMode.pickFilteredMediaInternal; return ListenableProvider>.value( - value: ValueNotifier(AppMode.pickMediaInternal), + value: ValueNotifier(mode), child: AvesScaffold( body: SelectionProvider( child: QueryProvider( diff --git a/lib/widgets/filter_grids/common/filter_tile.dart b/lib/widgets/filter_grids/common/filter_tile.dart index fbb72546e..f4c1cdf06 100644 --- a/lib/widgets/filter_grids/common/filter_tile.dart +++ b/lib/widgets/filter_grids/common/filter_tile.dart @@ -67,13 +67,7 @@ class _InteractiveFilterTileState extends State(filter); - case AppMode.pickMediaInternal: - case AppMode.screenSaver: - case AppMode.setWallpaper: - case AppMode.slideshow: - case AppMode.view: - case AppMode.edit: - case null: + default: break; } } diff --git a/lib/widgets/home_page.dart b/lib/widgets/home_page.dart index 3b7df0c1e..5af70b362 100644 --- a/lib/widgets/home_page.dart +++ b/lib/widgets/home_page.dart @@ -221,9 +221,7 @@ class _HomePageState extends State { case AppMode.edit: case AppMode.setWallpaper: await _initViewerEssentials(); - case AppMode.pickMediaInternal: - case AppMode.pickFilterInternal: - case AppMode.slideshow: + default: break; } @@ -331,12 +329,7 @@ class _HomePageState extends State { ); }, ); - case AppMode.main: - case AppMode.pickCollectionFiltersExternal: - case AppMode.pickMediaInternal: - case AppMode.pickFilterInternal: - case AppMode.screenSaver: - case AppMode.slideshow: + default: routeName = _initialRouteName ?? settings.homePage.routeName; filters = _initialFilters ?? (settings.homePage == HomePageSetting.collection ? settings.homeCustomCollection : {}); }