From 755e75dc6a28aa2afae07ee5f8100a9852e4823d Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Fri, 5 Jun 2020 14:55:52 +0900 Subject: [PATCH] filter grids: added empty content placeholder --- lib/widgets/app_drawer.dart | 13 +++++ .../selection_action_delegate.dart | 5 ++ lib/widgets/filter_grid_page.dart | 54 +++++++++++-------- 3 files changed, 50 insertions(+), 22 deletions(-) diff --git a/lib/widgets/app_drawer.dart b/lib/widgets/app_drawer.dart index 7990e15a9..ebd5cfd23 100644 --- a/lib/widgets/app_drawer.dart +++ b/lib/widgets/app_drawer.dart @@ -13,6 +13,7 @@ import 'package:aves/model/settings.dart'; import 'package:aves/utils/android_file_utils.dart'; import 'package:aves/widgets/about/about_page.dart'; import 'package:aves/widgets/album/collection_page.dart'; +import 'package:aves/widgets/album/empty.dart'; import 'package:aves/widgets/common/aves_logo.dart'; import 'package:aves/widgets/common/icons.dart'; import 'package:aves/widgets/debug_page.dart'; @@ -259,6 +260,10 @@ class _AppDrawerState extends State { title: 'Albums', filterEntries: source.getAlbumEntries(), filterBuilder: (s) => AlbumFilter(s, source.getUniqueAlbumName(s)), + emptyBuilder: () => const EmptyContent( + icon: AIcons.album, + text: 'No albums!', + ), ), ), ); @@ -274,6 +279,10 @@ class _AppDrawerState extends State { title: 'Countries', filterEntries: source.getCountryEntries(), filterBuilder: (s) => LocationFilter(LocationLevel.country, s), + emptyBuilder: () => const EmptyContent( + icon: AIcons.location, + text: 'No countries!', + ), ), ), ); @@ -289,6 +298,10 @@ class _AppDrawerState extends State { title: 'Tags', filterEntries: source.getTagEntries(), filterBuilder: (s) => TagFilter(s), + emptyBuilder: () => const EmptyContent( + icon: AIcons.tag, + text: 'No tags!', + ), ), ), ); diff --git a/lib/widgets/common/action_delegates/selection_action_delegate.dart b/lib/widgets/common/action_delegates/selection_action_delegate.dart index da0e8baaa..cb6829d07 100644 --- a/lib/widgets/common/action_delegates/selection_action_delegate.dart +++ b/lib/widgets/common/action_delegates/selection_action_delegate.dart @@ -8,6 +8,7 @@ import 'package:aves/model/metadata_db.dart'; import 'package:aves/services/android_app_service.dart'; import 'package:aves/services/image_file_service.dart'; import 'package:aves/widgets/album/app_bar.dart'; +import 'package:aves/widgets/album/empty.dart'; import 'package:aves/widgets/common/action_delegates/create_album_dialog.dart'; import 'package:aves/widgets/common/action_delegates/permission_aware.dart'; import 'package:aves/widgets/common/entry_actions.dart'; @@ -84,6 +85,10 @@ class SelectionActionDelegate with PermissionAwareMixin { ), filterEntries: source.getAlbumEntries(), filterBuilder: (s) => AlbumFilter(s, source.getUniqueAlbumName(s)), + emptyBuilder: () => const EmptyContent( + icon: AIcons.album, + text: 'No albums!', + ), onPressed: (filter) => Navigator.pop(context, (filter as AlbumFilter)?.album), ); }, diff --git a/lib/widgets/filter_grid_page.dart b/lib/widgets/filter_grid_page.dart index 5e5886fa5..82c3c2e65 100644 --- a/lib/widgets/filter_grid_page.dart +++ b/lib/widgets/filter_grid_page.dart @@ -24,12 +24,14 @@ class FilterNavigationPage extends StatelessWidget { final String title; final Map filterEntries; final CollectionFilter Function(String key) filterBuilder; + final Widget Function() emptyBuilder; const FilterNavigationPage({ @required this.source, @required this.title, @required this.filterEntries, @required this.filterBuilder, + @required this.emptyBuilder, }); @override @@ -42,6 +44,7 @@ class FilterNavigationPage extends StatelessWidget { ), filterEntries: filterEntries, filterBuilder: filterBuilder, + emptyBuilder: emptyBuilder, onPressed: (filter) => Navigator.pushAndRemoveUntil( context, MaterialPageRoute( @@ -63,6 +66,7 @@ class FilterGridPage extends StatelessWidget { final Widget appBar; final Map filterEntries; final CollectionFilter Function(String key) filterBuilder; + final Widget Function() emptyBuilder; final FilterCallback onPressed; const FilterGridPage({ @@ -70,6 +74,7 @@ class FilterGridPage extends StatelessWidget { @required this.appBar, @required this.filterEntries, @required this.filterBuilder, + @required this.emptyBuilder, @required this.onPressed, }); @@ -86,28 +91,33 @@ class FilterGridPage extends StatelessWidget { child: CustomScrollView( slivers: [ appBar, - SliverPadding( - padding: const EdgeInsets.all(AvesFilterChip.outlineWidth), - sliver: SliverGrid( - delegate: SliverChildBuilderDelegate( - (context, i) { - final key = filterKeys[i]; - return DecoratedFilterChip( - source: source, - filter: filterBuilder(key), - entry: filterEntries[key], - onPressed: onPressed, - ); - }, - childCount: filterKeys.length, - ), - gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( - maxCrossAxisExtent: maxCrossAxisExtent, - mainAxisSpacing: 8, - crossAxisSpacing: 8, - ), - ), - ), + filterKeys.isEmpty + ? SliverFillRemaining( + child: emptyBuilder(), + hasScrollBody: false, + ) + : SliverPadding( + padding: const EdgeInsets.all(AvesFilterChip.outlineWidth), + sliver: SliverGrid( + delegate: SliverChildBuilderDelegate( + (context, i) { + final key = filterKeys[i]; + return DecoratedFilterChip( + source: source, + filter: filterBuilder(key), + entry: filterEntries[key], + onPressed: onPressed, + ); + }, + childCount: filterKeys.length, + ), + gridDelegate: const SliverGridDelegateWithMaxCrossAxisExtent( + maxCrossAxisExtent: maxCrossAxisExtent, + mainAxisSpacing: 8, + crossAxisSpacing: 8, + ), + ), + ), SliverToBoxAdapter( child: Selector( selector: (context, mq) => mq.viewInsets.bottom,