From 11030760097a27d50bc23ded63bf7499034ed707 Mon Sep 17 00:00:00 2001 From: nyne Date: Tue, 25 Mar 2025 16:36:08 +0800 Subject: [PATCH] Improved page switching via keyboard. Close #293 --- lib/pages/reader/images.dart | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/pages/reader/images.dart b/lib/pages/reader/images.dart index 134a2a6..cce4b09 100644 --- a/lib/pages/reader/images.dart +++ b/lib/pages/reader/images.dart @@ -298,6 +298,8 @@ class _GalleryModeState extends State<_GalleryMode> photoViewController.animateScale?.call(target); } + Timer? keyRepeatTimer; + @override void handleKeyEvent(KeyEvent event) { bool? forward; @@ -320,7 +322,11 @@ class _GalleryModeState extends State<_GalleryMode> event.logicalKey == LogicalKeyboardKey.arrowRight) { forward = false; } - if (event is KeyDownEvent || event is KeyRepeatEvent) { + if (event is KeyDownEvent) { + if (keyRepeatTimer != null) { + keyRepeatTimer!.cancel(); + keyRepeatTimer = null; + } if (forward == true) { controller.nextPage( duration: const Duration(milliseconds: 200), @@ -333,6 +339,31 @@ class _GalleryModeState extends State<_GalleryMode> ); } } + if (event is KeyRepeatEvent && keyRepeatTimer == null) { + keyRepeatTimer = Timer.periodic( + const Duration(milliseconds: 100), + (timer) { + if (!mounted) { + timer.cancel(); + return; + } else if (forward == true) { + controller.nextPage( + duration: const Duration(milliseconds: 100), + curve: Curves.ease, + ); + } else if (forward == false) { + controller.previousPage( + duration: const Duration(milliseconds: 100), + curve: Curves.ease, + ); + } + }, + ); + } + if (event is KeyUpEvent && keyRepeatTimer != null) { + keyRepeatTimer!.cancel(); + keyRepeatTimer = null; + } } @override