From 408afd4c9ddd3126b6740310e77e10ee3ab8f98b Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sun, 2 Aug 2020 17:37:36 +0900 Subject: [PATCH] search: submitting query animate query chip like it was tapped --- .../album/search/expandable_filter_row.dart | 24 +++++++++---------- lib/widgets/album/search/search_delegate.dart | 14 +++++++++-- 2 files changed, 24 insertions(+), 14 deletions(-) diff --git a/lib/widgets/album/search/expandable_filter_row.dart b/lib/widgets/album/search/expandable_filter_row.dart index f5ca689bf..fe57ffc53 100644 --- a/lib/widgets/album/search/expandable_filter_row.dart +++ b/lib/widgets/album/search/expandable_filter_row.dart @@ -9,12 +9,14 @@ class ExpandableFilterRow extends StatelessWidget { final String title; final Iterable filters; final ValueNotifier expandedNotifier; + final HeroType Function(CollectionFilter filter) heroTypeBuilder; final FilterCallback onPressed; const ExpandableFilterRow({ this.title, @required this.filters, this.expandedNotifier, + this.heroTypeBuilder, @required this.onPressed, }); @@ -59,12 +61,7 @@ class ExpandableFilterRow extends StatelessWidget { child: Wrap( spacing: horizontalPadding, runSpacing: verticalPadding, - children: filtersList - .map((filter) => AvesFilterChip( - filter: filter, - onPressed: onPressed, - )) - .toList(), + children: filtersList.map(_buildFilterChip).toList(), ), ); final list = Container( @@ -78,12 +75,7 @@ class ExpandableFilterRow extends StatelessWidget { physics: BouncingScrollPhysics(), padding: EdgeInsets.symmetric(horizontal: horizontalPadding), itemBuilder: (context, index) { - if (index >= filtersList.length) return null; - final filter = filtersList[index]; - return AvesFilterChip( - filter: filter, - onPressed: onPressed, - ); + return index < filtersList.length ? _buildFilterChip(filtersList[index]) : null; }, separatorBuilder: (context, index) => SizedBox(width: 8), itemCount: filtersList.length, @@ -109,4 +101,12 @@ class ExpandableFilterRow extends StatelessWidget { ) : filterChips; } + + Widget _buildFilterChip(CollectionFilter filter) { + return AvesFilterChip( + filter: filter, + heroType: heroTypeBuilder?.call(filter) ?? HeroType.onTap, + onPressed: onPressed, + ); + } } diff --git a/lib/widgets/album/search/search_delegate.dart b/lib/widgets/album/search/search_delegate.dart index 3618c8822..28cc29f7a 100644 --- a/lib/widgets/album/search/search_delegate.dart +++ b/lib/widgets/album/search/search_delegate.dart @@ -62,19 +62,23 @@ class ImageSearchDelegate extends SearchDelegate { child: ValueListenableBuilder( valueListenable: expandedSectionNotifier, builder: (context, expandedSection, child) { + var queryFilter = _buildQueryFilter(false); return ListView( padding: EdgeInsets.only(top: 8), children: [ _buildFilterRow( context: context, filters: [ - _buildQueryFilter(false), + queryFilter, FavouriteFilter(), MimeFilter(MimeTypes.anyImage), MimeFilter(MimeTypes.anyVideo), MimeFilter(MimeFilter.animated), MimeFilter(MimeTypes.svg), ].where((f) => f != null && containQuery(f.label)), + // usually perform hero animation only on tapped chips, + // but we also need to animate the query chip when it is selected by submitting the search query + heroTypeBuilder: (filter) => filter == queryFilter ? HeroType.always : HeroType.onTap, ), StreamBuilder( stream: source.eventBus.on(), @@ -118,11 +122,17 @@ class ImageSearchDelegate extends SearchDelegate { ); } - Widget _buildFilterRow({@required BuildContext context, String title, @required Iterable filters}) { + Widget _buildFilterRow({ + @required BuildContext context, + String title, + @required Iterable filters, + HeroType Function(CollectionFilter filter) heroTypeBuilder, + }) { return ExpandableFilterRow( title: title, filters: filters, expandedNotifier: expandedSectionNotifier, + heroTypeBuilder: heroTypeBuilder, onPressed: (filter) => _select(context, filter is QueryFilter ? QueryFilter(filter.query) : filter), ); }