group fab; prevent empty filter grid scroll

This commit is contained in:
Thibault Deckers 2025-05-06 22:45:03 +02:00
parent 4b87717cd2
commit 27879a900d
2 changed files with 31 additions and 23 deletions

View file

@ -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/feedback.dart';
import 'package:aves/widgets/common/action_mixins/vault_aware.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/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/aves_filter_chip.dart';
import 'package:aves/widgets/common/identity/buttons/captioned_button.dart'; import 'package:aves/widgets/common/identity/buttons/captioned_button.dart';
import 'package:aves/widgets/common/identity/empty.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) { Widget? _buildFab(BuildContext context) {
return isPickingGroup return isPickingGroup
? AvesFab( ? FloatingActionButton.extended(
tooltip: context.l10n.groupPickerUseThisGroupButton,
onPressed: () { onPressed: () {
final groupUri = context.read<FilterGroupNotifier>().value; final groupUri = context.read<FilterGroupNotifier>().value;
final filter = groupUri != null ? albumGrouping.uriToFilter(groupUri) : AlbumGroupFilter.root; final filter = groupUri != null ? albumGrouping.uriToFilter(groupUri) : AlbumGroupFilter.root;
@ -199,6 +197,8 @@ class _AlbumPickPageState extends State<_AlbumPickPage> with FeedbackMixin, Vaul
_pickFilter(context, filter); _pickFilter(context, filter);
} }
}, },
icon: const Icon(AIcons.apply),
label: Text(context.l10n.groupPickerUseThisGroupButton),
) )
: null; : null;
} }

View file

@ -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/double_back.dart';
import 'package:aves/widgets/common/behaviour/pop/scope.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/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/build_context.dart';
import 'package:aves/widgets/common/extensions/media_query.dart'; import 'package:aves/widgets/common/extensions/media_query.dart';
import 'package:aves/widgets/common/grid/item_tracker.dart'; import 'package:aves/widgets/common/grid/item_tracker.dart';
@ -683,30 +684,37 @@ class _FilterScrollView<T extends CollectionFilter> extends StatelessWidget {
} }
Widget _buildScrollView(BuildContext context) { Widget _buildScrollView(BuildContext context) {
return CustomScrollView( return Selector<SectionedListLayout<FilterGridItem<T>>, bool>(
key: scrollableKey, selector: (context, layout) => layout.sections.isEmpty,
controller: scrollController, builder: (context, isEmpty, child) {
slivers: [ return CustomScrollView(
appBar, key: scrollableKey,
AnimationLimiter( controller: scrollController,
key: ValueKey(context.select<FilterGroupNotifier?, Uri?>((v) => v?.value)), // workaround to prevent scrolling the app bar away
child: Selector<SectionedListLayout<FilterGridItem<T>>, bool>( // when there is no content and we use `SliverFillRemaining`
selector: (context, layout) => layout.sections.isEmpty, physics: isEmpty
builder: (context, empty, child) { ? const NeverScrollableScrollPhysics()
return empty : SloppyScrollPhysics(
// TODO TLAD [nested] prevent scrolling when empty (cf CollectionPage) gestureSettings: MediaQuery.gestureSettingsOf(context),
parent: const AlwaysScrollableScrollPhysics(),
),
slivers: [
appBar,
AnimationLimiter(
key: ValueKey(context.select<FilterGroupNotifier?, Uri?>((v) => v?.value)),
child: isEmpty
? SliverFillRemaining( ? SliverFillRemaining(
hasScrollBody: false, hasScrollBody: false,
child: emptyBuilder(), child: emptyBuilder(),
) )
: SectionedListSliver<FilterGridItem<T>>(); : SectionedListSliver<FilterGridItem<T>>(),
}, ),
), const NavBarPaddingSliver(),
), const BottomPaddingSliver(),
const NavBarPaddingSliver(), const TvTileGridBottomPaddingSliver(),
const BottomPaddingSliver(), ],
const TvTileGridBottomPaddingSliver(), );
], },
); );
} }
} }