diff --git a/lib/model/query.dart b/lib/model/query.dart index 7bb5c5241..c1c510a6d 100644 --- a/lib/model/query.dart +++ b/lib/model/query.dart @@ -4,6 +4,13 @@ import 'package:aves/utils/change_notifier.dart'; import 'package:flutter/foundation.dart'; class Query extends ChangeNotifier { + Query({required String? initialValue}) { + if (initialValue != null && initialValue.isNotEmpty) { + _enabled = true; + queryNotifier.value = initialValue; + } + } + bool _enabled = false; bool get enabled => _enabled; diff --git a/lib/services/media/enums.dart b/lib/services/media/enums.dart index 7ffed6cf4..2f52e69c3 100644 --- a/lib/services/media/enums.dart +++ b/lib/services/media/enums.dart @@ -1,11 +1,13 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; +import 'package:flutter/foundation.dart'; import 'package:flutter/widgets.dart'; // names should match possible values on platform enum NameConflictStrategy { rename, replace, skip } extension ExtraNameConflictStrategy on NameConflictStrategy { - String toPlatform() => toString().substring('NameConflictStrategy.'.length); + // TODO TLAD [dart 2.15] replace `describeEnum()` by `enum.name` + String toPlatform() => describeEnum(this); String getName(BuildContext context) { switch (this) { diff --git a/lib/widgets/collection/app_bar.dart b/lib/widgets/collection/app_bar.dart index d55dcdbbf..baeed3e2d 100644 --- a/lib/widgets/collection/app_bar.dart +++ b/lib/widgets/collection/app_bar.dart @@ -296,7 +296,8 @@ class _CollectionAppBarState extends State with SingleTickerPr } // key is expected by test driver (e.g. 'menu-sort', 'menu-group', 'menu-map') - Key _getActionKey(EntrySetAction action) => Key('menu-${action.toString().substring('EntrySetAction.'.length)}'); + // TODO TLAD [dart 2.15] replace `describeEnum()` by `enum.name` + Key _getActionKey(EntrySetAction action) => Key('menu-${describeEnum(action)}'); Widget _toActionButton(EntrySetAction action, {required bool enabled}) { final onPressed = enabled ? () => _onActionSelected(action) : null; diff --git a/lib/widgets/collection/collection_page.dart b/lib/widgets/collection/collection_page.dart index 20d8607e2..94dcd625a 100644 --- a/lib/widgets/collection/collection_page.dart +++ b/lib/widgets/collection/collection_page.dart @@ -1,4 +1,5 @@ import 'package:aves/model/entry.dart'; +import 'package:aves/model/filters/query.dart'; import 'package:aves/model/selection.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/widgets/collection/collection_grid.dart'; @@ -8,6 +9,7 @@ import 'package:aves/widgets/common/providers/media_query_data_provider.dart'; import 'package:aves/widgets/common/providers/query_provider.dart'; import 'package:aves/widgets/common/providers/selection_provider.dart'; import 'package:aves/widgets/drawer/app_drawer.dart'; +import 'package:collection/collection.dart'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; @@ -37,10 +39,12 @@ class _CollectionPageState extends State { @override Widget build(BuildContext context) { + final liveFilter = collection.filters.firstWhereOrNull((v) => v is QueryFilter && v.live) as QueryFilter?; return MediaQueryDataProvider( child: Scaffold( body: SelectionProvider( child: QueryProvider( + initialQuery: liveFilter?.query, child: Builder( builder: (context) => WillPopScope( onWillPop: () { diff --git a/lib/widgets/common/providers/query_provider.dart b/lib/widgets/common/providers/query_provider.dart index 75a062eec..472d444e8 100644 --- a/lib/widgets/common/providers/query_provider.dart +++ b/lib/widgets/common/providers/query_provider.dart @@ -3,17 +3,19 @@ import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; class QueryProvider extends StatelessWidget { + final String? initialQuery; final Widget child; const QueryProvider({ Key? key, + required this.initialQuery, required this.child, }) : super(key: key); @override Widget build(BuildContext context) { return ChangeNotifierProvider( - create: (context) => Query(), + create: (context) => Query(initialValue: initialQuery), child: child, ); } diff --git a/lib/widgets/dialogs/item_pick_dialog.dart b/lib/widgets/dialogs/item_pick_dialog.dart index 51b2f497d..d12c7a1df 100644 --- a/lib/widgets/dialogs/item_pick_dialog.dart +++ b/lib/widgets/dialogs/item_pick_dialog.dart @@ -1,5 +1,6 @@ import 'package:aves/app_mode.dart'; import 'package:aves/model/entry.dart'; +import 'package:aves/model/filters/query.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/widgets/collection/collection_grid.dart'; import 'package:aves/widgets/collection/collection_page.dart'; @@ -9,6 +10,7 @@ import 'package:aves/widgets/common/providers/query_provider.dart'; import 'package:aves/widgets/common/providers/selection_provider.dart'; import 'package:flutter/material.dart'; import 'package:provider/provider.dart'; +import 'package:collection/collection.dart'; class ItemPickDialog extends StatefulWidget { static const routeName = '/item_pick'; @@ -35,12 +37,14 @@ class _ItemPickDialogState extends State { @override Widget build(BuildContext context) { + final liveFilter = collection.filters.firstWhereOrNull((v) => v is QueryFilter && v.live) as QueryFilter?; return ListenableProvider>.value( value: ValueNotifier(AppMode.pickInternal), child: MediaQueryDataProvider( child: Scaffold( body: SelectionProvider( child: QueryProvider( + initialQuery: liveFilter?.query, child: GestureAreaProtectorStack( child: SafeArea( bottom: false,