#967 pick collection with removable contextual filters to edit date/location

This commit is contained in:
Thibault Deckers 2024-04-08 22:51:15 +02:00
parent e9b86f9d77
commit 71e9e07668
13 changed files with 48 additions and 54 deletions

View file

@ -3,7 +3,8 @@ enum AppMode {
pickCollectionFiltersExternal, pickCollectionFiltersExternal,
pickSingleMediaExternal, pickSingleMediaExternal,
pickMultipleMediaExternal, pickMultipleMediaExternal,
pickMediaInternal, pickFilteredMediaInternal,
pickUnfilteredMediaInternal,
pickFilterInternal, pickFilterInternal,
screenSaver, screenSaver,
setWallpaper, setWallpaper,
@ -40,6 +41,7 @@ extension ExtraAppMode on AppMode {
bool get isPickingMedia => { bool get isPickingMedia => {
AppMode.pickSingleMediaExternal, AppMode.pickSingleMediaExternal,
AppMode.pickMultipleMediaExternal, AppMode.pickMultipleMediaExternal,
AppMode.pickMediaInternal, AppMode.pickFilteredMediaInternal,
AppMode.pickUnfilteredMediaInternal,
}.contains(this); }.contains(this);
} }

View file

@ -385,14 +385,7 @@ class _AvesAppState extends State<AvesApp> with WidgetsBindingObserver {
case AppMode.pickMultipleMediaExternal: case AppMode.pickMultipleMediaExternal:
_saveTopEntries(); _saveTopEntries();
break; break;
case AppMode.pickCollectionFiltersExternal: default:
case AppMode.pickMediaInternal:
case AppMode.pickFilterInternal:
case AppMode.screenSaver:
case AppMode.setWallpaper:
case AppMode.slideshow:
case AppMode.view:
case AppMode.edit:
break; break;
} }
case AppLifecycleState.resumed: case AppLifecycleState.resumed:

View file

@ -163,7 +163,7 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
child: AnimatedBuilder( child: AnimatedBuilder(
animation: collection.filterChangeNotifier, animation: collection.filterChangeNotifier,
builder: (context, child) { builder: (context, child) {
final removableFilters = appMode != AppMode.pickMediaInternal; final canRemoveFilters = appMode != AppMode.pickFilteredMediaInternal;
return Selector<Query, bool>( return Selector<Query, bool>(
selector: (context, query) => query.enabled, selector: (context, query) => query.enabled,
builder: (context, queryEnabled, child) { builder: (context, queryEnabled, child) {
@ -172,7 +172,7 @@ class _CollectionAppBarState extends State<CollectionAppBar> with SingleTickerPr
builder: (context, _, child) { builder: (context, _, child) {
final useTvLayout = settings.useTvLayout; final useTvLayout = settings.useTvLayout;
final actions = _buildActions(context, selection); final actions = _buildActions(context, selection);
final onFilterTap = removableFilters ? collection.removeFilter : null; final onFilterTap = canRemoveFilters ? collection.removeFilter : null;
return AvesAppBar( return AvesAppBar(
contentHeight: appBarContentHeight, contentHeight: appBarContentHeight,
pinned: context.select<Selection<AvesEntry>, bool>((selection) => selection.isSelecting), pinned: context.select<Selection<AvesEntry>, bool>((selection) => selection.isSelecting),

View file

@ -251,7 +251,7 @@ class _CollectionGridContentState extends State<_CollectionGridContent> {
if (selection.isSelecting) { if (selection.isSelecting) {
child = MultiProvider( child = MultiProvider(
providers: [ providers: [
ListenableProvider<ValueNotifier<AppMode>>.value(value: ValueNotifier(AppMode.pickMediaInternal)), ListenableProvider<ValueNotifier<AppMode>>.value(value: ValueNotifier(AppMode.pickFilteredMediaInternal)),
ChangeNotifierProvider<Selection<AvesEntry>>.value(value: selection), ChangeNotifierProvider<Selection<AvesEntry>>.value(value: selection),
], ],
child: child, child: child,

View file

@ -201,15 +201,7 @@ class _CollectionPageState extends State<CollectionPage> {
IntentService.submitPickedCollectionFilters(filters); IntentService.submitPickedCollectionFilters(filters);
}, },
); );
case AppMode.main: default:
case AppMode.pickSingleMediaExternal:
case AppMode.pickMediaInternal:
case AppMode.pickFilterInternal:
case AppMode.screenSaver:
case AppMode.setWallpaper:
case AppMode.slideshow:
case AppMode.view:
case AppMode.edit:
return null; return null;
} }
} }

View file

@ -46,7 +46,8 @@ class InteractiveTile extends StatelessWidget {
case AppMode.pickMultipleMediaExternal: case AppMode.pickMultipleMediaExternal:
final selection = context.read<Selection<AvesEntry>>(); final selection = context.read<Selection<AvesEntry>>();
selection.toggleSelection(entry); selection.toggleSelection(entry);
case AppMode.pickMediaInternal: case AppMode.pickFilteredMediaInternal:
case AppMode.pickUnfilteredMediaInternal:
Navigator.maybeOf(context)?.pop(entry); Navigator.maybeOf(context)?.pop(entry);
case AppMode.pickCollectionFiltersExternal: case AppMode.pickCollectionFiltersExternal:
case AppMode.pickFilterInternal: case AppMode.pickFilterInternal:

View file

@ -124,6 +124,7 @@ class _AddShortcutDialogState extends State<AddShortcutDialog> {
source: _collection.source, source: _collection.source,
filters: pickFilters, filters: pickFilters,
), ),
canRemoveFilters: false,
); );
}, },
fullscreenDialog: true, fullscreenDialog: true,

View file

@ -322,21 +322,31 @@ class _EditEntryDateDialogState extends State<EditEntryDateDialog> {
)); ));
} }
CollectionLens? _createPickCollection() {
final baseCollection = widget.collection;
return baseCollection != null
? CollectionLens(
source: baseCollection.source,
filters: baseCollection.filters,
)
: null;
}
Future<void> _pickCopyItemSource() async { Future<void> _pickCopyItemSource() async {
final _collection = widget.collection; final pickCollection = _createPickCollection();
if (_collection == null) return; if (pickCollection == null) return;
final entry = await Navigator.maybeOf(context)?.push<AvesEntry>( final entry = await Navigator.maybeOf(context)?.push<AvesEntry>(
MaterialPageRoute( MaterialPageRoute(
settings: const RouteSettings(name: ItemPickPage.routeName), settings: const RouteSettings(name: ItemPickPage.routeName),
builder: (context) => ItemPickPage( builder: (context) => ItemPickPage(
collection: CollectionLens( collection: pickCollection,
source: _collection.source, canRemoveFilters: true,
),
), ),
fullscreenDialog: true, fullscreenDialog: true,
), ),
); );
pickCollection.dispose();
if (entry != null) { if (entry != null) {
setState(() => _copyItemSource = entry); setState(() => _copyItemSource = entry);
} }

View file

@ -169,9 +169,9 @@ class _EditEntryLocationDialogState extends State<EditEntryLocationDialog> {
); );
} }
Future<void> _pickLocation() async { CollectionLens? _createPickCollection() {
final baseCollection = widget.collection; final baseCollection = widget.collection;
final mapCollection = baseCollection != null return baseCollection != null
? CollectionLens( ? CollectionLens(
source: baseCollection.source, source: baseCollection.source,
filters: { filters: {
@ -180,17 +180,21 @@ class _EditEntryLocationDialogState extends State<EditEntryLocationDialog> {
}, },
) )
: null; : null;
}
Future<void> _pickLocation() async {
final pickCollection = _createPickCollection();
final latLng = await Navigator.maybeOf(context)?.push( final latLng = await Navigator.maybeOf(context)?.push(
MaterialPageRoute( MaterialPageRoute(
settings: const RouteSettings(name: LocationPickPage.routeName), settings: const RouteSettings(name: LocationPickPage.routeName),
builder: (context) => LocationPickPage( builder: (context) => LocationPickPage(
collection: mapCollection, collection: pickCollection,
initialLocation: _mapCoordinates, initialLocation: _mapCoordinates,
), ),
fullscreenDialog: true, fullscreenDialog: true,
), ),
); );
mapCollection?.dispose(); pickCollection?.dispose();
if (latLng != null) { if (latLng != null) {
settings.mapDefaultCenter = latLng; settings.mapDefaultCenter = latLng;
setState(() { setState(() {
@ -218,20 +222,20 @@ class _EditEntryLocationDialogState extends State<EditEntryLocationDialog> {
} }
Future<void> _pickCopyItemSource() async { Future<void> _pickCopyItemSource() async {
final _collection = widget.collection; final pickCollection = _createPickCollection();
if (_collection == null) return; if (pickCollection == null) return;
final entry = await Navigator.maybeOf(context)?.push<AvesEntry>( final entry = await Navigator.maybeOf(context)?.push<AvesEntry>(
MaterialPageRoute( MaterialPageRoute(
settings: const RouteSettings(name: ItemPickPage.routeName), settings: const RouteSettings(name: ItemPickPage.routeName),
builder: (context) => ItemPickPage( builder: (context) => ItemPickPage(
collection: CollectionLens( collection: pickCollection,
source: _collection.source, canRemoveFilters: true,
),
), ),
fullscreenDialog: true, fullscreenDialog: true,
), ),
); );
pickCollection.dispose();
if (entry != null) { if (entry != null) {
setState(() { setState(() {
_copyItemSource = entry; _copyItemSource = entry;

View file

@ -344,6 +344,7 @@ class _CoverSelectionDialogState extends State<CoverSelectionDialog> {
source: context.read<CollectionSource>(), source: context.read<CollectionSource>(),
filters: {filter}, filters: {filter},
), ),
canRemoveFilters: false,
), ),
fullscreenDialog: true, fullscreenDialog: true,
), ),

View file

@ -16,10 +16,12 @@ class ItemPickPage extends StatefulWidget {
static const routeName = '/item_pick'; static const routeName = '/item_pick';
final CollectionLens collection; final CollectionLens collection;
final bool canRemoveFilters;
const ItemPickPage({ const ItemPickPage({
super.key, super.key,
required this.collection, required this.collection,
required this.canRemoveFilters,
}); });
@override @override
@ -38,8 +40,9 @@ class _ItemPickPageState extends State<ItemPickPage> {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final liveFilter = collection.filters.firstWhereOrNull((v) => v is QueryFilter && v.live) as QueryFilter?; final liveFilter = collection.filters.firstWhereOrNull((v) => v is QueryFilter && v.live) as QueryFilter?;
final mode = widget.canRemoveFilters ? AppMode.pickUnfilteredMediaInternal : AppMode.pickFilteredMediaInternal;
return ListenableProvider<ValueNotifier<AppMode>>.value( return ListenableProvider<ValueNotifier<AppMode>>.value(
value: ValueNotifier(AppMode.pickMediaInternal), value: ValueNotifier(mode),
child: AvesScaffold( child: AvesScaffold(
body: SelectionProvider<AvesEntry>( body: SelectionProvider<AvesEntry>(
child: QueryProvider( child: QueryProvider(

View file

@ -67,13 +67,7 @@ class _InteractiveFilterTileState<T extends CollectionFilter> extends State<Inte
} }
case AppMode.pickFilterInternal: case AppMode.pickFilterInternal:
Navigator.maybeOf(context)?.pop<T>(filter); Navigator.maybeOf(context)?.pop<T>(filter);
case AppMode.pickMediaInternal: default:
case AppMode.screenSaver:
case AppMode.setWallpaper:
case AppMode.slideshow:
case AppMode.view:
case AppMode.edit:
case null:
break; break;
} }
} }

View file

@ -221,9 +221,7 @@ class _HomePageState extends State<HomePage> {
case AppMode.edit: case AppMode.edit:
case AppMode.setWallpaper: case AppMode.setWallpaper:
await _initViewerEssentials(); await _initViewerEssentials();
case AppMode.pickMediaInternal: default:
case AppMode.pickFilterInternal:
case AppMode.slideshow:
break; break;
} }
@ -331,12 +329,7 @@ class _HomePageState extends State<HomePage> {
); );
}, },
); );
case AppMode.main: default:
case AppMode.pickCollectionFiltersExternal:
case AppMode.pickMediaInternal:
case AppMode.pickFilterInternal:
case AppMode.screenSaver:
case AppMode.slideshow:
routeName = _initialRouteName ?? settings.homePage.routeName; routeName = _initialRouteName ?? settings.homePage.routeName;
filters = _initialFilters ?? (settings.homePage == HomePageSetting.collection ? settings.homeCustomCollection : {}); filters = _initialFilters ?? (settings.homePage == HomePageSetting.collection ? settings.homeCustomCollection : {});
} }