diff --git a/CHANGELOG.md b/CHANGELOG.md index fb35625fa..34eed96ef 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -8,6 +8,10 @@ All notable changes to this project will be documented in this file. - option to set the Tags page as home +### Changed + +- remember whether to show the title filter when picking albums + ## [v1.8.6] - 2023-04-30 ### Added diff --git a/lib/model/query.dart b/lib/model/query.dart index 82be471d9..29d950240 100644 --- a/lib/model/query.dart +++ b/lib/model/query.dart @@ -8,7 +8,8 @@ class Query extends ChangeNotifier { final ValueNotifier _queryNotifier = ValueNotifier(''); final StreamController _enabledStreamController = StreamController.broadcast(); - Query({required String? initialValue}) { + Query({required bool enabled, required String? initialValue}) { + _enabled = enabled; if (initialValue != null && initialValue.isNotEmpty) { _enabled = true; queryNotifier.value = initialValue; diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 86a9019ea..b9a0ea3c8 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -118,6 +118,7 @@ class Settings extends ChangeNotifier { static const tagSortReverseKey = 'tag_sort_reverse'; static const pinnedFiltersKey = 'pinned_filters'; static const hiddenFiltersKey = 'hidden_filters'; + static const showAlbumPickQueryKey = 'show_album_pick_query'; // viewer static const viewerQuickActionsKey = 'viewer_quick_actions'; @@ -625,6 +626,10 @@ class Settings extends ChangeNotifier { hiddenFilters = _hiddenFilters; } + bool get showAlbumPickQuery => getBool(showAlbumPickQueryKey) ?? false; + + set showAlbumPickQuery(bool newValue) => _set(showAlbumPickQueryKey, newValue); + // viewer List get viewerQuickActions => getEnumListOrDefault(viewerQuickActionsKey, SettingsDefaults.viewerQuickActions, EntryAction.values); @@ -1107,6 +1112,7 @@ class Settings extends ChangeNotifier { case stateSortReverseKey: case placeSortReverseKey: case tagSortReverseKey: + case showAlbumPickQueryKey: case showOverlayOnOpeningKey: case showOverlayMinimapKey: case showOverlayInfoKey: diff --git a/lib/widgets/common/providers/query_provider.dart b/lib/widgets/common/providers/query_provider.dart index 426cb7c56..e811e92ad 100644 --- a/lib/widgets/common/providers/query_provider.dart +++ b/lib/widgets/common/providers/query_provider.dart @@ -3,19 +3,24 @@ import 'package:flutter/widgets.dart'; import 'package:provider/provider.dart'; class QueryProvider extends StatelessWidget { + final bool enabled; final String? initialQuery; final Widget child; const QueryProvider({ super.key, - required this.initialQuery, + this.enabled = false, + this.initialQuery, required this.child, }); @override Widget build(BuildContext context) { return ChangeNotifierProvider( - create: (context) => Query(initialValue: initialQuery), + create: (context) => Query( + enabled: enabled, + initialValue: initialQuery, + ), child: child, ); } diff --git a/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart b/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart index 6a74cd192..253e1ebaa 100644 --- a/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart +++ b/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart @@ -14,6 +14,7 @@ import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; import 'package:aves/widgets/common/identity/empty.dart'; +import 'package:aves/widgets/common/providers/query_provider.dart'; import 'package:aves/widgets/common/providers/selection_provider.dart'; import 'package:aves/widgets/dialogs/aves_confirmation_dialog.dart'; import 'package:aves/widgets/dialogs/filter_editors/create_album_dialog.dart'; @@ -106,28 +107,31 @@ class _AlbumPickPageState extends State<_AlbumPickPage> { builder: (context, snapshot) { final gridItems = AlbumListPage.getAlbumGridItems(context, source); return SelectionProvider>( - child: FilterGridPage( - settingsRouteKey: AlbumListPage.routeName, - appBar: FilterGridAppBar( - source: source, - title: title, - actionDelegate: AlbumChipSetActionDelegate(gridItems), - actionsBuilder: _buildActions, - isEmpty: false, + child: QueryProvider( + enabled: settings.showAlbumPickQuery, + child: FilterGridPage( + settingsRouteKey: AlbumListPage.routeName, + appBar: FilterGridAppBar( + source: source, + title: title, + actionDelegate: _AlbumChipSetPickActionDelegate(gridItems), + actionsBuilder: _buildActions, + isEmpty: false, + appBarHeightNotifier: _appBarHeightNotifier, + ), appBarHeightNotifier: _appBarHeightNotifier, + sections: AlbumListPage.groupToSections(context, source, gridItems), + newFilters: source.getNewAlbumFilters(context), + sortFactor: settings.albumSortFactor, + showHeaders: settings.albumGroupFactor != AlbumChipGroupFactor.none, + selectable: false, + applyQuery: AlbumListPage.applyQuery, + emptyBuilder: () => EmptyContent( + icon: AIcons.album, + text: context.l10n.albumEmpty, + ), + heroType: HeroType.never, ), - appBarHeightNotifier: _appBarHeightNotifier, - sections: AlbumListPage.groupToSections(context, source, gridItems), - newFilters: source.getNewAlbumFilters(context), - sortFactor: settings.albumSortFactor, - showHeaders: settings.albumGroupFactor != AlbumChipGroupFactor.none, - selectable: false, - applyQuery: AlbumListPage.applyQuery, - emptyBuilder: () => EmptyContent( - icon: AIcons.album, - text: context.l10n.albumEmpty, - ), - heroType: HeroType.never, ), ); }, @@ -276,3 +280,15 @@ class _AlbumPickPageState extends State<_AlbumPickPage> { Navigator.maybeOf(context)?.pop(filter); } } + +class _AlbumChipSetPickActionDelegate extends AlbumChipSetActionDelegate { + _AlbumChipSetPickActionDelegate(super.items); + + @override + void onActionSelected(BuildContext context, Set filters, ChipSetAction action) { + if (action == ChipSetAction.toggleTitleSearch) { + settings.showAlbumPickQuery = !settings.showAlbumPickQuery; + } + super.onActionSelected(context, filters, action); + } +} diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index 168e616f8..39567170b 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -29,7 +29,6 @@ import 'package:aves/widgets/common/grid/sliver.dart'; import 'package:aves/widgets/common/grid/theme.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/common/identity/scroll_thumb.dart'; -import 'package:aves/widgets/common/providers/query_provider.dart'; import 'package:aves/widgets/common/providers/tile_extent_controller_provider.dart'; import 'package:aves/widgets/common/thumbnail/image.dart'; import 'package:aves/widgets/common/tile_extent_controller.dart'; @@ -82,38 +81,35 @@ class FilterGridPage extends StatelessWidget { @override Widget build(BuildContext context) { final useTvLayout = settings.useTvLayout; - final body = QueryProvider( - initialQuery: null, - child: GestureAreaProtectorStack( - child: DirectionalSafeArea( - start: !useTvLayout, - top: false, - bottom: false, - child: Selector( - selector: (context, mq) => mq.padding.top, - builder: (context, mqPaddingTop, child) { - return ValueListenableBuilder( - valueListenable: appBarHeightNotifier, - builder: (context, appBarHeight, child) { - return _FilterGrid( - // key is expected by test driver - key: const Key('filter-grid'), - settingsRouteKey: settingsRouteKey, - appBar: appBar, - appBarHeight: mqPaddingTop + appBarHeight, - sections: sections, - newFilters: newFilters, - sortFactor: sortFactor, - showHeaders: showHeaders, - selectable: selectable, - applyQuery: applyQuery, - emptyBuilder: emptyBuilder, - heroType: heroType, - ); - }, - ); - }, - ), + final body = GestureAreaProtectorStack( + child: DirectionalSafeArea( + start: !useTvLayout, + top: false, + bottom: false, + child: Selector( + selector: (context, mq) => mq.padding.top, + builder: (context, mqPaddingTop, child) { + return ValueListenableBuilder( + valueListenable: appBarHeightNotifier, + builder: (context, appBarHeight, child) { + return _FilterGrid( + // key is expected by test driver + key: const Key('filter-grid'), + settingsRouteKey: settingsRouteKey, + appBar: appBar, + appBarHeight: mqPaddingTop + appBarHeight, + sections: sections, + newFilters: newFilters, + sortFactor: sortFactor, + showHeaders: showHeaders, + selectable: selectable, + applyQuery: applyQuery, + emptyBuilder: emptyBuilder, + heroType: heroType, + ); + }, + ); + }, ), ), ); diff --git a/lib/widgets/filter_grids/common/filter_nav_page.dart b/lib/widgets/filter_grids/common/filter_nav_page.dart index 7f235c29f..b2a156655 100644 --- a/lib/widgets/filter_grids/common/filter_nav_page.dart +++ b/lib/widgets/filter_grids/common/filter_nav_page.dart @@ -2,6 +2,7 @@ import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/utils/time_utils.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; +import 'package:aves/widgets/common/providers/query_provider.dart'; import 'package:aves/widgets/common/providers/selection_provider.dart'; import 'package:aves/widgets/filter_grids/common/action_delegates/chip_set.dart'; import 'package:aves/widgets/filter_grids/common/app_bar.dart'; @@ -106,30 +107,32 @@ class _FilterNavigationPageState>( child: Builder( - builder: (context) => FilterGridPage( - appBar: FilterGridAppBar( - source: widget.source, - title: widget.title, - actionDelegate: widget.actionDelegate, - isEmpty: widget.filterSections.isEmpty, + builder: (context) => QueryProvider( + child: FilterGridPage( + appBar: FilterGridAppBar( + source: widget.source, + title: widget.title, + actionDelegate: widget.actionDelegate, + isEmpty: widget.filterSections.isEmpty, + appBarHeightNotifier: _appBarHeightNotifier, + ), appBarHeightNotifier: _appBarHeightNotifier, + sections: widget.filterSections, + newFilters: widget.newFilters ?? {}, + sortFactor: widget.sortFactor, + showHeaders: widget.showHeaders, + selectable: true, + applyQuery: widget.applyQuery, + emptyBuilder: () => ValueListenableBuilder( + valueListenable: widget.source.stateNotifier, + builder: (context, sourceState, child) { + return sourceState != SourceState.loading ? widget.emptyBuilder() : const SizedBox(); + }, + ), + // do not always enable hero, otherwise unwanted hero gets triggered + // when using `Show in [...]` action from a chip in the Collection filter bar + heroType: HeroType.onTap, ), - appBarHeightNotifier: _appBarHeightNotifier, - sections: widget.filterSections, - newFilters: widget.newFilters ?? {}, - sortFactor: widget.sortFactor, - showHeaders: widget.showHeaders, - selectable: true, - applyQuery: widget.applyQuery, - emptyBuilder: () => ValueListenableBuilder( - valueListenable: widget.source.stateNotifier, - builder: (context, sourceState, child) { - return sourceState != SourceState.loading ? widget.emptyBuilder() : const SizedBox(); - }, - ), - // do not always enable hero, otherwise unwanted hero gets triggered - // when using `Show in [...]` action from a chip in the Collection filter bar - heroType: HeroType.onTap, ), ), );