diff --git a/lib/intent.dart b/lib/intent.dart index 4d2dfbf..17c8557 100644 --- a/lib/intent.dart +++ b/lib/intent.dart @@ -23,3 +23,12 @@ class PlayVideoIntent extends Intent { class ListenVideoIntent extends Intent { const ListenVideoIntent(); } + +class ScrollMoveTopIntent extends Intent{ + const ScrollMoveTopIntent(); +} + +class ScrollMoveBottomIntent extends Intent{ + const ScrollMoveBottomIntent(); +} + diff --git a/lib/page/history.dart b/lib/page/history.dart index f198fb2..a480753 100644 --- a/lib/page/history.dart +++ b/lib/page/history.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:autoscroll/autoscroll.dart'; import 'package:fluent_ui/fluent_ui.dart'; +import 'package:flutter/services.dart'; import 'package:shared_preferences/shared_preferences.dart'; import 'package:youtube_api/youtube_api.dart'; @@ -19,6 +20,7 @@ class HistoryPage extends StatefulWidget { class _HistoryPageState extends State { final FocusNode searchBarFocus = FocusNode(); + final ScrollController scrollController = ScrollController(); List? filteredList; List? historyList; late final Map> _actionMap = { @@ -27,6 +29,16 @@ class _HistoryPageState extends State { ), NavigationPopIntent: CallbackAction( onInvoke: (final _) => _navigationPop(context), + ), + ScrollMoveTopIntent: CallbackAction( + onInvoke: (final _) => scrollController.jumpTo( + scrollController.position.minScrollExtent, + ), + ), + ScrollMoveBottomIntent: CallbackAction( + onInvoke: (final _) => scrollController.jumpTo( + scrollController.position.maxScrollExtent, + ), ) }; @@ -84,7 +96,17 @@ class _HistoryPageState extends State { ), ), content: KeyboardNavigation( + additionalShortcuts: { + const SingleActivator( + LogicalKeyboardKey.keyG, + ): const ScrollMoveTopIntent(), + const SingleActivator( + LogicalKeyboardKey.keyG, + shift: true, + ): const ScrollMoveBottomIntent(), + }, child: AutoscrollListView.builder( + controller: scrollController, itemCount: filteredList?.length ?? 0, itemBuilder: (final context, final index) { final youtubeVideo = diff --git a/lib/widget/search_result.dart b/lib/widget/search_result.dart index cabf1ad..8b084a2 100644 --- a/lib/widget/search_result.dart +++ b/lib/widget/search_result.dart @@ -2,9 +2,11 @@ library search_result; import 'package:autoscroll/autoscroll.dart'; import 'package:fluent_ui/fluent_ui.dart'; +import 'package:flutter/services.dart'; import 'package:youtube_api/youtube_api.dart'; import '../helper/command_parser.dart'; +import '../intent.dart'; import 'keyboard_navigation.dart'; import 'list_items/list_item.dart'; @@ -25,10 +27,36 @@ class SearchResult extends StatefulWidget { } class _SearchResultState extends State { + final scrollController = ScrollController(); + late final actions = { + ScrollMoveTopIntent: CallbackAction( + onInvoke: (final _) => scrollController.jumpTo( + scrollController.position.minScrollExtent, + ), + ), + ScrollMoveBottomIntent: CallbackAction( + onInvoke: (final _) => scrollController.jumpTo( + scrollController.position.maxScrollExtent, + ), + ) + }; + final shortcuts = { + const SingleActivator( + LogicalKeyboardKey.keyG, + ): const ScrollMoveTopIntent(), + const SingleActivator( + LogicalKeyboardKey.keyG, + shift: true, + ): const ScrollMoveBottomIntent(), + }; + @override Widget build(final BuildContext context) { return KeyboardNavigation( + additionalActions: actions, + additionalShortcuts: shortcuts, child: AutoscrollListView.builder( + controller: scrollController, itemCount: widget.result.length + 1, itemBuilder: (final context, final index) { if (index == widget.result.length) { diff --git a/package/autoscroll/example/lib/main.dart b/package/autoscroll/example/lib/main.dart index 0f5d096..42ad44b 100644 --- a/package/autoscroll/example/lib/main.dart +++ b/package/autoscroll/example/lib/main.dart @@ -247,7 +247,7 @@ class _ListBuilderState extends State { @override Widget build(BuildContext context) { return AutoscrollListView.builder( - autoScrollSpeed: widget.autoscrollSpeed, + autoscrollSpeed: widget.autoscrollSpeed, itemCount: widget.selectedList.length, itemBuilder: (_, int index) { return ListTile(