From 27879a900d8eba3648378a3a8edf342bd1e8775e Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Tue, 6 May 2025 22:45:03 +0200 Subject: [PATCH] group fab; prevent empty filter grid scroll --- .../dialogs/pick_dialogs/album_pick_page.dart | 6 +-- .../filter_grids/common/filter_grid_page.dart | 48 +++++++++++-------- 2 files changed, 31 insertions(+), 23 deletions(-) diff --git a/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart b/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart index ec86cdcce..2fc110f80 100644 --- a/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart +++ b/lib/widgets/dialogs/pick_dialogs/album_pick_page.dart @@ -18,7 +18,6 @@ import 'package:aves/view/view.dart'; import 'package:aves/widgets/common/action_mixins/feedback.dart'; import 'package:aves/widgets/common/action_mixins/vault_aware.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; -import 'package:aves/widgets/common/identity/aves_fab.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'; @@ -190,8 +189,7 @@ class _AlbumPickPageState extends State<_AlbumPickPage> with FeedbackMixin, Vaul Widget? _buildFab(BuildContext context) { return isPickingGroup - ? AvesFab( - tooltip: context.l10n.groupPickerUseThisGroupButton, + ? FloatingActionButton.extended( onPressed: () { final groupUri = context.read().value; final filter = groupUri != null ? albumGrouping.uriToFilter(groupUri) : AlbumGroupFilter.root; @@ -199,6 +197,8 @@ class _AlbumPickPageState extends State<_AlbumPickPage> with FeedbackMixin, Vaul _pickFilter(context, filter); } }, + icon: const Icon(AIcons.apply), + label: Text(context.l10n.groupPickerUseThisGroupButton), ) : null; } diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index 22b1dc747..bf0da1499 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -18,6 +18,7 @@ import 'package:aves/widgets/common/basic/scaffold.dart'; import 'package:aves/widgets/common/behaviour/pop/double_back.dart'; import 'package:aves/widgets/common/behaviour/pop/scope.dart'; import 'package:aves/widgets/common/behaviour/pop/tv_navigation.dart'; +import 'package:aves/widgets/common/behaviour/sloppy_scroll_physics.dart'; import 'package:aves/widgets/common/extensions/build_context.dart'; import 'package:aves/widgets/common/extensions/media_query.dart'; import 'package:aves/widgets/common/grid/item_tracker.dart'; @@ -683,30 +684,37 @@ class _FilterScrollView extends StatelessWidget { } Widget _buildScrollView(BuildContext context) { - return CustomScrollView( - key: scrollableKey, - controller: scrollController, - slivers: [ - appBar, - AnimationLimiter( - key: ValueKey(context.select((v) => v?.value)), - child: Selector>, bool>( - selector: (context, layout) => layout.sections.isEmpty, - builder: (context, empty, child) { - return empty - // TODO TLAD [nested] prevent scrolling when empty (cf CollectionPage) + return Selector>, bool>( + selector: (context, layout) => layout.sections.isEmpty, + builder: (context, isEmpty, child) { + return CustomScrollView( + key: scrollableKey, + controller: scrollController, + // workaround to prevent scrolling the app bar away + // when there is no content and we use `SliverFillRemaining` + physics: isEmpty + ? const NeverScrollableScrollPhysics() + : SloppyScrollPhysics( + gestureSettings: MediaQuery.gestureSettingsOf(context), + parent: const AlwaysScrollableScrollPhysics(), + ), + slivers: [ + appBar, + AnimationLimiter( + key: ValueKey(context.select((v) => v?.value)), + child: isEmpty ? SliverFillRemaining( hasScrollBody: false, child: emptyBuilder(), ) - : SectionedListSliver>(); - }, - ), - ), - const NavBarPaddingSliver(), - const BottomPaddingSliver(), - const TvTileGridBottomPaddingSliver(), - ], + : SectionedListSliver>(), + ), + const NavBarPaddingSliver(), + const BottomPaddingSliver(), + const TvTileGridBottomPaddingSliver(), + ], + ); + }, ); } }