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 Selector<SectionedListLayout<FilterGridItem<T>>, bool>(
selector: (context, layout) => layout.sections.isEmpty,
builder: (context, isEmpty, child) {
return CustomScrollView( return CustomScrollView(
key: scrollableKey, key: scrollableKey,
controller: scrollController, 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: [ slivers: [
appBar, appBar,
AnimationLimiter( AnimationLimiter(
key: ValueKey(context.select<FilterGroupNotifier?, Uri?>((v) => v?.value)), key: ValueKey(context.select<FilterGroupNotifier?, Uri?>((v) => v?.value)),
child: Selector<SectionedListLayout<FilterGridItem<T>>, bool>( child: isEmpty
selector: (context, layout) => layout.sections.isEmpty,
builder: (context, empty, child) {
return empty
// TODO TLAD [nested] prevent scrolling when empty (cf CollectionPage)
? SliverFillRemaining( ? SliverFillRemaining(
hasScrollBody: false, hasScrollBody: false,
child: emptyBuilder(), child: emptyBuilder(),
) )
: SectionedListSliver<FilterGridItem<T>>(); : SectionedListSliver<FilterGridItem<T>>(),
},
),
), ),
const NavBarPaddingSliver(), const NavBarPaddingSliver(),
const BottomPaddingSliver(), const BottomPaddingSliver(),
const TvTileGridBottomPaddingSliver(), const TvTileGridBottomPaddingSliver(),
], ],
); );
},
);
} }
} }