fixed scrolling to highlight item in some cases
This commit is contained in:
parent
d889a26e62
commit
584e5cae6c
3 changed files with 25 additions and 19 deletions
|
@ -7,6 +7,7 @@ import 'package:aves/model/filters/query.dart';
|
|||
import 'package:aves/model/filters/trash.dart';
|
||||
import 'package:aves/model/highlight.dart';
|
||||
import 'package:aves/model/selection.dart';
|
||||
import 'package:aves/model/settings/enums/accessibility_animations.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
import 'package:aves/model/source/collection_lens.dart';
|
||||
import 'package:aves/model/source/collection_source.dart';
|
||||
|
@ -214,11 +215,13 @@ class _CollectionPageState extends State<CollectionPage> {
|
|||
final highlightTest = widget.highlightTest;
|
||||
if (highlightTest == null) return;
|
||||
|
||||
final item = _collection.sortedEntries.firstWhereOrNull(highlightTest);
|
||||
if (item == null) return;
|
||||
|
||||
final delayDuration = context.read<DurationsData>().staggeredAnimationPageTarget;
|
||||
await Future.delayed(delayDuration + Durations.highlightScrollInitDelay);
|
||||
final targetEntry = _collection.sortedEntries.firstWhereOrNull(highlightTest);
|
||||
if (targetEntry != null) {
|
||||
context.read<HighlightInfo>().trackItem(targetEntry, highlightItem: targetEntry);
|
||||
}
|
||||
|
||||
final animate = context.read<Settings>().accessibilityAnimations.animate;
|
||||
context.read<HighlightInfo>().trackItem(item, animate: animate, highlightItem: item);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -110,24 +110,24 @@ class _GridItemTrackerState<T> extends State<GridItemTracker<T>> with WidgetsBin
|
|||
final itemVisibility = max(0, tileRect.intersect(viewportRect).height) / tileRect.height;
|
||||
if (!event.predicate(itemVisibility)) return;
|
||||
|
||||
double scrollOffset = tileRect.top + (tileRect.height - scrollableSize.height) * ((event.alignment.y + 1) / 2);
|
||||
// most of the time the app bar will be scrolled away after scaling,
|
||||
// so we compensate for it to center the focal point thumbnail
|
||||
final appBarHeight = appBarHeightNotifier.value;
|
||||
final scrollOffset = appBarHeight + tileRect.top + (tileRect.height - scrollableSize.height) * ((event.alignment.y + 1) / 2);
|
||||
scrollOffset += appBarHeightNotifier.value;
|
||||
scrollOffset = scrollOffset.clamp(0, scrollController.position.maxScrollExtent);
|
||||
|
||||
if (event.animate) {
|
||||
if (scrollOffset > 0) {
|
||||
if (event.animate) {
|
||||
await scrollController.animateTo(
|
||||
scrollOffset,
|
||||
duration: Duration(milliseconds: (scrollOffset / 2).round().clamp(Durations.highlightScrollAnimationMinMillis, Durations.highlightScrollAnimationMaxMillis)),
|
||||
curve: Curves.easeInOutCubic,
|
||||
);
|
||||
}
|
||||
} else {
|
||||
final maxScrollExtent = scrollController.position.maxScrollExtent;
|
||||
scrollController.jumpTo(scrollOffset.clamp(.0, maxScrollExtent));
|
||||
scrollController.jumpTo(scrollOffset);
|
||||
await Future.delayed(Durations.highlightJumpDelay);
|
||||
}
|
||||
}
|
||||
|
||||
final highlightItem = event.highlightItem;
|
||||
if (highlightItem != null) {
|
||||
|
|
|
@ -5,6 +5,7 @@ import 'package:aves/model/filters/filters.dart';
|
|||
import 'package:aves/model/highlight.dart';
|
||||
import 'package:aves/model/query.dart';
|
||||
import 'package:aves/model/selection.dart';
|
||||
import 'package:aves/model/settings/enums/accessibility_animations.dart';
|
||||
import 'package:aves/model/settings/settings.dart';
|
||||
import 'package:aves/model/source/collection_source.dart';
|
||||
import 'package:aves/model/source/enums/enums.dart';
|
||||
|
@ -520,13 +521,15 @@ class _FilterSectionedContentState<T extends CollectionFilter> extends State<_Fi
|
|||
Future<void> _checkInitHighlight() async {
|
||||
final highlightInfo = context.read<HighlightInfo>();
|
||||
final filter = highlightInfo.clear();
|
||||
if (filter is T) {
|
||||
final gridItem = visibleSections.values.expand((list) => list).firstWhereOrNull((gridItem) => gridItem.filter == filter);
|
||||
if (gridItem != null) {
|
||||
if (filter is! T) return;
|
||||
|
||||
final item = visibleSections.values.expand((list) => list).firstWhereOrNull((gridItem) => gridItem.filter == filter);
|
||||
if (item == null) return;
|
||||
|
||||
await Future.delayed(Durations.highlightScrollInitDelay);
|
||||
highlightInfo.trackItem(gridItem, highlightItem: filter);
|
||||
}
|
||||
}
|
||||
|
||||
final animate = context.read<Settings>().accessibilityAnimations.animate;
|
||||
highlightInfo.trackItem(item, animate: animate, highlightItem: filter);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue