From fcde32d55501630ee8644d9c69209e56a7e50e27 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Sat, 27 Jul 2024 20:41:22 +0200 Subject: [PATCH] #1102 accessibility: enable/disable more animations --- lib/theme/durations.dart | 2 -- lib/widgets/collection/filter_bar.dart | 4 +++- .../action_controls/togglers/favourite.dart | 17 ++++++++++------- lib/widgets/common/grid/header.dart | 6 ++++-- lib/widgets/common/grid/overlay.dart | 3 +-- lib/widgets/common/thumbnail/overlay.dart | 2 +- .../viewer/overlay/selection_button.dart | 2 +- 7 files changed, 20 insertions(+), 16 deletions(-) diff --git a/lib/theme/durations.dart b/lib/theme/durations.dart index 5bd83f525..4fa368f36 100644 --- a/lib/theme/durations.dart +++ b/lib/theme/durations.dart @@ -29,8 +29,6 @@ class ADurations { // collection animations static const filterBarRemovalAnimation = Duration(milliseconds: 400); static const collectionOpOverlayAnimation = Duration(milliseconds: 300); - static const sectionHeaderAnimation = Duration(milliseconds: 200); - static const thumbnailOverlayAnimation = Duration(milliseconds: 200); // search animations static const filterRowExpandAnimation = Duration(milliseconds: 300); diff --git a/lib/widgets/collection/filter_bar.dart b/lib/widgets/collection/filter_bar.dart index 3a9ee4b29..f4f2715c2 100644 --- a/lib/widgets/collection/filter_bar.dart +++ b/lib/widgets/collection/filter_bar.dart @@ -1,8 +1,10 @@ import 'package:aves/model/filters/filters.dart'; +import 'package:aves/model/settings/settings.dart'; import 'package:aves/theme/durations.dart'; import 'package:aves/widgets/common/identity/aves_app_bar.dart'; import 'package:aves/widgets/common/identity/aves_filter_chip.dart'; import 'package:flutter/material.dart'; +import 'package:provider/provider.dart'; class FilterBar extends StatefulWidget { static const EdgeInsets chipPadding = EdgeInsets.symmetric(horizontal: 4); @@ -45,7 +47,7 @@ class _FilterBarState extends State { existing.removeAt(index); // only animate item removal when triggered by a user interaction with the chip, // not from automatic chip replacement following chip selection - final animate = _userTappedFilter == filter; + final animate = context.read().animate && _userTappedFilter == filter; listState!.removeItem( index, animate diff --git a/lib/widgets/common/action_controls/togglers/favourite.dart b/lib/widgets/common/action_controls/togglers/favourite.dart index 31b0bbd79..ea683b0a6 100644 --- a/lib/widgets/common/action_controls/togglers/favourite.dart +++ b/lib/widgets/common/action_controls/togglers/favourite.dart @@ -1,6 +1,7 @@ import 'package:aves/model/entry/entry.dart'; import 'package:aves/model/entry/extensions/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/icons.dart'; import 'package:aves/widgets/common/basic/popup/menu_row.dart'; @@ -73,6 +74,7 @@ class _FavouriteTogglerState extends State { icon: const Icon(isNotFavouriteIcon), ); } + final animate = context.select((v) => v.animate); return Stack( alignment: Alignment.center, children: [ @@ -82,14 +84,15 @@ class _FavouriteTogglerState extends State { focusNode: widget.focusNode, tooltip: isFavourite ? context.l10n.entryActionRemoveFavourite : context.l10n.entryActionAddFavourite, ), - Sweeper( - key: ValueKey(entries.length == 1 ? entries.first : entries.length), - builder: (context) => Icon( - favouriteSweeperIcon, - color: context.select((v) => v.favourite), + if (animate) + Sweeper( + key: ValueKey(entries.length == 1 ? entries.first : entries.length), + builder: (context) => Icon( + favouriteSweeperIcon, + color: context.select((v) => v.favourite), + ), + toggledNotifier: _isFavouriteNotifier, ), - toggledNotifier: _isFavouriteNotifier, - ), ], ); }, diff --git a/lib/widgets/common/grid/header.dart b/lib/widgets/common/grid/header.dart index b1efa5884..0b60f13c0 100644 --- a/lib/widgets/common/grid/header.dart +++ b/lib/widgets/common/grid/header.dart @@ -189,6 +189,7 @@ class _SectionSelectableLeading extends StatelessWidget { Widget build(BuildContext context) { if (!selectable) return _buildBrowsing(context); + final duration = context.select((v) => v.formTransition); final isSelecting = context.select, bool>((selection) => selection.isSelecting); final Widget child = isSelecting ? _SectionSelectingLeading( @@ -201,7 +202,7 @@ class _SectionSelectableLeading extends StatelessWidget { descendantsAreFocusable: false, descendantsAreTraversable: false, child: AnimatedSwitcher( - duration: ADurations.sectionHeaderAnimation, + duration: duration, switchInCurve: Curves.easeInOut, switchOutCurve: Curves.easeInOut, transitionBuilder: (child, animation) { @@ -240,11 +241,12 @@ class _SectionSelectingLeading extends StatelessWidget { @override Widget build(BuildContext context) { + final duration = context.select((v) => v.formTransition); final sectionEntries = context.watch>().sections[sectionKey] ?? []; final selection = context.watch>(); final isSelected = selection.isSelected(sectionEntries); return AnimatedSwitcher( - duration: ADurations.sectionHeaderAnimation, + duration: duration, switchInCurve: Curves.easeOutBack, switchOutCurve: Curves.easeOutBack, transitionBuilder: (child, animation) => ScaleTransition( diff --git a/lib/widgets/common/grid/overlay.dart b/lib/widgets/common/grid/overlay.dart index f50b1a11c..ed53d9a12 100644 --- a/lib/widgets/common/grid/overlay.dart +++ b/lib/widgets/common/grid/overlay.dart @@ -10,8 +10,6 @@ class GridItemSelectionOverlay extends StatelessWidget { final BorderRadius? borderRadius; final EdgeInsets? padding; - static const duration = ADurations.thumbnailOverlayAnimation; - const GridItemSelectionOverlay({ super.key, required this.item, @@ -21,6 +19,7 @@ class GridItemSelectionOverlay extends StatelessWidget { @override Widget build(BuildContext context) { + final duration = context.select((v) => v.formTransition); final isSelecting = context.select, bool>((selection) => selection.isSelecting); return AnimatedSwitcher( duration: duration, diff --git a/lib/widgets/common/thumbnail/overlay.dart b/lib/widgets/common/thumbnail/overlay.dart index abbe77111..28050d13f 100644 --- a/lib/widgets/common/thumbnail/overlay.dart +++ b/lib/widgets/common/thumbnail/overlay.dart @@ -89,10 +89,10 @@ class ThumbnailZoomOverlay extends StatelessWidget { }); static const alignment = AlignmentDirectional.bottomEnd; - static const duration = ADurations.thumbnailOverlayAnimation; @override Widget build(BuildContext context) { + final duration = context.select((v) => v.formTransition); final isSelecting = context.select, bool>((selection) => selection.isSelecting); final interactiveDimension = context.select((t) => t.interactiveDimension); return AnimatedSwitcher( diff --git a/lib/widgets/viewer/overlay/selection_button.dart b/lib/widgets/viewer/overlay/selection_button.dart index 9549dbf82..d7f9f94e2 100644 --- a/lib/widgets/viewer/overlay/selection_button.dart +++ b/lib/widgets/viewer/overlay/selection_button.dart @@ -15,7 +15,6 @@ class SelectionButton extends StatelessWidget { final Animation scale; static const double padding = 8; - static const duration = ADurations.thumbnailOverlayAnimation; const SelectionButton({ super.key, @@ -27,6 +26,7 @@ class SelectionButton extends StatelessWidget { Widget build(BuildContext context) { final l10n = context.l10n; final selection = context.read>(); + final duration = context.select((v) => v.formTransition); return SafeArea( top: false, bottom: false,