filter grids: added empty content placeholder

This commit is contained in:
Thibault Deckers 2020-06-05 14:55:52 +09:00
parent 02d869c02a
commit 755e75dc6a
3 changed files with 50 additions and 22 deletions

View file

@ -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<AppDrawer> {
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<AppDrawer> {
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<AppDrawer> {
title: 'Tags',
filterEntries: source.getTagEntries(),
filterBuilder: (s) => TagFilter(s),
emptyBuilder: () => const EmptyContent(
icon: AIcons.tag,
text: 'No tags!',
),
),
),
);

View file

@ -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<String>(context, (filter as AlbumFilter)?.album),
);
},

View file

@ -24,12 +24,14 @@ class FilterNavigationPage extends StatelessWidget {
final String title;
final Map<String, ImageEntry> 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<String, ImageEntry> 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<MediaQueryData, double>(
selector: (context, mq) => mq.viewInsets.bottom,