From ff517925f6a96aed12e8b815f4e47d6db61904e6 Mon Sep 17 00:00:00 2001 From: Thibault Deckers Date: Thu, 4 Feb 2021 13:29:46 +0900 Subject: [PATCH] collection: scroll to top on sort/group change --- lib/model/settings/settings.dart | 2 -- lib/model/source/collection_lens.dart | 4 +++- lib/widgets/collection/thumbnail/overlay.dart | 2 +- lib/widgets/collection/thumbnail_collection.dart | 12 +++++++----- lib/widgets/common/grid/header.dart | 4 ++-- .../filter_grids/common/filter_grid_page.dart | 2 +- lib/widgets/viewer/entry_viewer_stack.dart | 2 +- 7 files changed, 15 insertions(+), 13 deletions(-) diff --git a/lib/model/settings/settings.dart b/lib/model/settings/settings.dart index 1f06c24ea..fcd9a5823 100644 --- a/lib/model/settings/settings.dart +++ b/lib/model/settings/settings.dart @@ -16,8 +16,6 @@ import '../source/enums.dart'; final Settings settings = Settings._private(); -typedef SettingsCallback = void Function(String key, dynamic oldValue, dynamic newValue); - class Settings extends ChangeNotifier { static SharedPreferences _prefs; diff --git a/lib/model/source/collection_lens.dart b/lib/model/source/collection_lens.dart index 1c7d77933..93d49148a 100644 --- a/lib/model/source/collection_lens.dart +++ b/lib/model/source/collection_lens.dart @@ -20,7 +20,7 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel final Set filters; EntryGroupFactor groupFactor; EntrySortFactor sortFactor; - final AChangeNotifier filterChangeNotifier = AChangeNotifier(); + final AChangeNotifier filterChangeNotifier = AChangeNotifier(), sortGroupChangeNotifier = AChangeNotifier(); int id; bool listenToSource; @@ -111,11 +111,13 @@ class CollectionLens with ChangeNotifier, CollectionActivityMixin, CollectionSel this.sortFactor = sortFactor; _applySort(); _applyGroup(); + sortGroupChangeNotifier.notifyListeners(); } void group(EntryGroupFactor groupFactor) { this.groupFactor = groupFactor; _applyGroup(); + sortGroupChangeNotifier.notifyListeners(); } void _applyFilters() { diff --git a/lib/widgets/collection/thumbnail/overlay.dart b/lib/widgets/collection/thumbnail/overlay.dart index 4858f28b3..24be3b2a4 100644 --- a/lib/widgets/collection/thumbnail/overlay.dart +++ b/lib/widgets/collection/thumbnail/overlay.dart @@ -75,7 +75,7 @@ class ThumbnailSelectionOverlay extends StatelessWidget { const duration = Durations.thumbnailOverlayAnimation; final fontSize = min(14.0, (extent / 8)).roundToDouble(); final iconSize = fontSize * 2; - final collection = Provider.of(context); + final collection = context.watch(); return ValueListenableBuilder( valueListenable: collection.activityNotifier, builder: (context, activity, child) { diff --git a/lib/widgets/collection/thumbnail_collection.dart b/lib/widgets/collection/thumbnail_collection.dart index aa2c848c9..44397c9ae 100644 --- a/lib/widgets/collection/thumbnail_collection.dart +++ b/lib/widgets/collection/thumbnail_collection.dart @@ -1,10 +1,10 @@ import 'dart:async'; import 'package:aves/main.dart'; +import 'package:aves/model/entry.dart'; import 'package:aves/model/filters/favourite.dart'; import 'package:aves/model/filters/mime.dart'; import 'package:aves/model/highlight.dart'; -import 'package:aves/model/entry.dart'; import 'package:aves/model/source/collection_lens.dart'; import 'package:aves/model/source/collection_source.dart'; import 'package:aves/ref/mime_types.dart'; @@ -109,7 +109,7 @@ class ThumbnailCollection extends StatelessWidget { final sectionedListLayout = context.read>(); return sectionedListLayout.getTileRect(entry) ?? Rect.zero; }, - onScaled: (entry) => Provider.of(context, listen: false).add(entry), + onScaled: (entry) => context.read().add(entry), child: scrollView, ); @@ -195,12 +195,14 @@ class _CollectionScrollViewState extends State { } void _registerWidget(CollectionScrollView widget) { - widget.collection.filterChangeNotifier.addListener(_onFilterChange); + widget.collection.filterChangeNotifier.addListener(_scrollToTop); + widget.collection.sortGroupChangeNotifier.addListener(_scrollToTop); widget.scrollController.addListener(_onScrollChange); } void _unregisterWidget(CollectionScrollView widget) { - widget.collection.filterChangeNotifier.removeListener(_onFilterChange); + widget.collection.filterChangeNotifier.removeListener(_scrollToTop); + widget.collection.sortGroupChangeNotifier.removeListener(_scrollToTop); widget.scrollController.removeListener(_onScrollChange); } @@ -283,7 +285,7 @@ class _CollectionScrollViewState extends State { ); } - void _onFilterChange() => widget.scrollController.jumpTo(0); + void _scrollToTop() => widget.scrollController.jumpTo(0); void _onScrollChange() { widget.isScrollingNotifier.value = true; diff --git a/lib/widgets/common/grid/header.dart b/lib/widgets/common/grid/header.dart index 3acf4c2af..da4b4eca5 100644 --- a/lib/widgets/common/grid/header.dart +++ b/lib/widgets/common/grid/header.dart @@ -76,7 +76,7 @@ class SectionHeader extends StatelessWidget { } void _toggleSectionSelection(BuildContext context) { - final collection = Provider.of(context, listen: false); + final collection = context.read(); final sectionEntries = collection.sections[sectionKey]; final selected = collection.isSelected(sectionEntries); if (selected) { @@ -140,7 +140,7 @@ class _SectionSelectableLeading extends StatelessWidget { Widget build(BuildContext context) { if (!selectable) return _buildBrowsing(context); - final collection = Provider.of(context); + final collection = context.watch(); return ValueListenableBuilder( valueListenable: collection.activityNotifier, builder: (context, activity, child) { diff --git a/lib/widgets/filter_grids/common/filter_grid_page.dart b/lib/widgets/filter_grids/common/filter_grid_page.dart index fcdb2e61f..20b9c29b9 100644 --- a/lib/widgets/filter_grids/common/filter_grid_page.dart +++ b/lib/widgets/filter_grids/common/filter_grid_page.dart @@ -138,7 +138,7 @@ class FilterGridPage extends StatelessWidget { final sectionedListLayout = context.read>>(); return sectionedListLayout.getTileRect(item) ?? Rect.zero; }, - onScaled: (item) => Provider.of(context, listen: false).add(item.filter), + onScaled: (item) => context.read().add(item.filter), child: scrollView, ); diff --git a/lib/widgets/viewer/entry_viewer_stack.dart b/lib/widgets/viewer/entry_viewer_stack.dart index 8b1d070b1..92a690a71 100644 --- a/lib/widgets/viewer/entry_viewer_stack.dart +++ b/lib/widgets/viewer/entry_viewer_stack.dart @@ -467,7 +467,7 @@ class _EntryViewerStackState extends State with SingleTickerPr _overlayAnimationController.value = _overlayAnimationController.upperBound; } } else { - final mediaQuery = Provider.of(context, listen: false); + final mediaQuery = context.read(); setState(() { _frozenViewInsets = mediaQuery.viewInsets; _frozenViewPadding = mediaQuery.viewPadding;