#1102 accessibility: enable/disable more animations

This commit is contained in:
Thibault Deckers 2024-07-27 20:41:22 +02:00
parent 20ca48a5ed
commit fcde32d555
7 changed files with 20 additions and 16 deletions

View file

@ -29,8 +29,6 @@ class ADurations {
// collection animations // collection animations
static const filterBarRemovalAnimation = Duration(milliseconds: 400); static const filterBarRemovalAnimation = Duration(milliseconds: 400);
static const collectionOpOverlayAnimation = Duration(milliseconds: 300); static const collectionOpOverlayAnimation = Duration(milliseconds: 300);
static const sectionHeaderAnimation = Duration(milliseconds: 200);
static const thumbnailOverlayAnimation = Duration(milliseconds: 200);
// search animations // search animations
static const filterRowExpandAnimation = Duration(milliseconds: 300); static const filterRowExpandAnimation = Duration(milliseconds: 300);

View file

@ -1,8 +1,10 @@
import 'package:aves/model/filters/filters.dart'; import 'package:aves/model/filters/filters.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/theme/durations.dart'; import 'package:aves/theme/durations.dart';
import 'package:aves/widgets/common/identity/aves_app_bar.dart'; import 'package:aves/widgets/common/identity/aves_app_bar.dart';
import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:provider/provider.dart';
class FilterBar extends StatefulWidget { class FilterBar extends StatefulWidget {
static const EdgeInsets chipPadding = EdgeInsets.symmetric(horizontal: 4); static const EdgeInsets chipPadding = EdgeInsets.symmetric(horizontal: 4);
@ -45,7 +47,7 @@ class _FilterBarState extends State<FilterBar> {
existing.removeAt(index); existing.removeAt(index);
// only animate item removal when triggered by a user interaction with the chip, // only animate item removal when triggered by a user interaction with the chip,
// not from automatic chip replacement following chip selection // not from automatic chip replacement following chip selection
final animate = _userTappedFilter == filter; final animate = context.read<Settings>().animate && _userTappedFilter == filter;
listState!.removeItem( listState!.removeItem(
index, index,
animate animate

View file

@ -1,6 +1,7 @@
import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/entry.dart';
import 'package:aves/model/entry/extensions/favourites.dart'; import 'package:aves/model/entry/extensions/favourites.dart';
import 'package:aves/model/favourites.dart'; import 'package:aves/model/favourites.dart';
import 'package:aves/model/settings/settings.dart';
import 'package:aves/theme/colors.dart'; import 'package:aves/theme/colors.dart';
import 'package:aves/theme/icons.dart'; import 'package:aves/theme/icons.dart';
import 'package:aves/widgets/common/basic/popup/menu_row.dart'; import 'package:aves/widgets/common/basic/popup/menu_row.dart';
@ -73,6 +74,7 @@ class _FavouriteTogglerState extends State<FavouriteToggler> {
icon: const Icon(isNotFavouriteIcon), icon: const Icon(isNotFavouriteIcon),
); );
} }
final animate = context.select<Settings, bool>((v) => v.animate);
return Stack( return Stack(
alignment: Alignment.center, alignment: Alignment.center,
children: [ children: [
@ -82,14 +84,15 @@ class _FavouriteTogglerState extends State<FavouriteToggler> {
focusNode: widget.focusNode, focusNode: widget.focusNode,
tooltip: isFavourite ? context.l10n.entryActionRemoveFavourite : context.l10n.entryActionAddFavourite, tooltip: isFavourite ? context.l10n.entryActionRemoveFavourite : context.l10n.entryActionAddFavourite,
), ),
Sweeper( if (animate)
key: ValueKey(entries.length == 1 ? entries.first : entries.length), Sweeper(
builder: (context) => Icon( key: ValueKey(entries.length == 1 ? entries.first : entries.length),
favouriteSweeperIcon, builder: (context) => Icon(
color: context.select<AvesColorsData, Color>((v) => v.favourite), favouriteSweeperIcon,
color: context.select<AvesColorsData, Color>((v) => v.favourite),
),
toggledNotifier: _isFavouriteNotifier,
), ),
toggledNotifier: _isFavouriteNotifier,
),
], ],
); );
}, },

View file

@ -189,6 +189,7 @@ class _SectionSelectableLeading<T> extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
if (!selectable) return _buildBrowsing(context); if (!selectable) return _buildBrowsing(context);
final duration = context.select<DurationsData, Duration>((v) => v.formTransition);
final isSelecting = context.select<Selection<T>, bool>((selection) => selection.isSelecting); final isSelecting = context.select<Selection<T>, bool>((selection) => selection.isSelecting);
final Widget child = isSelecting final Widget child = isSelecting
? _SectionSelectingLeading<T>( ? _SectionSelectingLeading<T>(
@ -201,7 +202,7 @@ class _SectionSelectableLeading<T> extends StatelessWidget {
descendantsAreFocusable: false, descendantsAreFocusable: false,
descendantsAreTraversable: false, descendantsAreTraversable: false,
child: AnimatedSwitcher( child: AnimatedSwitcher(
duration: ADurations.sectionHeaderAnimation, duration: duration,
switchInCurve: Curves.easeInOut, switchInCurve: Curves.easeInOut,
switchOutCurve: Curves.easeInOut, switchOutCurve: Curves.easeInOut,
transitionBuilder: (child, animation) { transitionBuilder: (child, animation) {
@ -240,11 +241,12 @@ class _SectionSelectingLeading<T> extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final duration = context.select<DurationsData, Duration>((v) => v.formTransition);
final sectionEntries = context.watch<SectionedListLayout<T>>().sections[sectionKey] ?? []; final sectionEntries = context.watch<SectionedListLayout<T>>().sections[sectionKey] ?? [];
final selection = context.watch<Selection<T>>(); final selection = context.watch<Selection<T>>();
final isSelected = selection.isSelected(sectionEntries); final isSelected = selection.isSelected(sectionEntries);
return AnimatedSwitcher( return AnimatedSwitcher(
duration: ADurations.sectionHeaderAnimation, duration: duration,
switchInCurve: Curves.easeOutBack, switchInCurve: Curves.easeOutBack,
switchOutCurve: Curves.easeOutBack, switchOutCurve: Curves.easeOutBack,
transitionBuilder: (child, animation) => ScaleTransition( transitionBuilder: (child, animation) => ScaleTransition(

View file

@ -10,8 +10,6 @@ class GridItemSelectionOverlay<T> extends StatelessWidget {
final BorderRadius? borderRadius; final BorderRadius? borderRadius;
final EdgeInsets? padding; final EdgeInsets? padding;
static const duration = ADurations.thumbnailOverlayAnimation;
const GridItemSelectionOverlay({ const GridItemSelectionOverlay({
super.key, super.key,
required this.item, required this.item,
@ -21,6 +19,7 @@ class GridItemSelectionOverlay<T> extends StatelessWidget {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final duration = context.select<DurationsData, Duration>((v) => v.formTransition);
final isSelecting = context.select<Selection<T>, bool>((selection) => selection.isSelecting); final isSelecting = context.select<Selection<T>, bool>((selection) => selection.isSelecting);
return AnimatedSwitcher( return AnimatedSwitcher(
duration: duration, duration: duration,

View file

@ -89,10 +89,10 @@ class ThumbnailZoomOverlay extends StatelessWidget {
}); });
static const alignment = AlignmentDirectional.bottomEnd; static const alignment = AlignmentDirectional.bottomEnd;
static const duration = ADurations.thumbnailOverlayAnimation;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final duration = context.select<DurationsData, Duration>((v) => v.formTransition);
final isSelecting = context.select<Selection<AvesEntry>, bool>((selection) => selection.isSelecting); final isSelecting = context.select<Selection<AvesEntry>, bool>((selection) => selection.isSelecting);
final interactiveDimension = context.select<GridThemeData, double>((t) => t.interactiveDimension); final interactiveDimension = context.select<GridThemeData, double>((t) => t.interactiveDimension);
return AnimatedSwitcher( return AnimatedSwitcher(

View file

@ -15,7 +15,6 @@ class SelectionButton extends StatelessWidget {
final Animation<double> scale; final Animation<double> scale;
static const double padding = 8; static const double padding = 8;
static const duration = ADurations.thumbnailOverlayAnimation;
const SelectionButton({ const SelectionButton({
super.key, super.key,
@ -27,6 +26,7 @@ class SelectionButton extends StatelessWidget {
Widget build(BuildContext context) { Widget build(BuildContext context) {
final l10n = context.l10n; final l10n = context.l10n;
final selection = context.read<Selection<AvesEntry>>(); final selection = context.read<Selection<AvesEntry>>();
final duration = context.select<DurationsData, Duration>((v) => v.formTransition);
return SafeArea( return SafeArea(
top: false, top: false,
bottom: false, bottom: false,