#967 pick collection with removable contextual filters to edit date/location
This commit is contained in:
parent
e9b86f9d77
commit
71e9e07668
13 changed files with 48 additions and 54 deletions
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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),
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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:
|
||||||
|
|
|
@ -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,
|
||||||
|
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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,
|
||||||
),
|
),
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -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 : {});
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue