diff --git a/lib/pages/image_viewer/image_viewer.dart b/lib/pages/image_viewer/image_viewer.dart index 2b2b315e0..80f9b371d 100644 --- a/lib/pages/image_viewer/image_viewer.dart +++ b/lib/pages/image_viewer/image_viewer.dart @@ -1,4 +1,5 @@ import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:matrix/matrix.dart'; @@ -26,6 +27,8 @@ class ImageViewer extends StatefulWidget { } class ImageViewerController extends State { + final FocusNode focusNode = FocusNode(); + @override void initState() { super.initState(); @@ -45,6 +48,17 @@ class ImageViewerController extends State { late final List allEvents; + void onKeyEvent(KeyEvent event) { + switch (event.logicalKey) { + case LogicalKeyboardKey.arrowLeft: + if (canGoBack) prevImage(); + break; + case LogicalKeyboardKey.arrowRight: + if (canGoNext) nextImage(); + break; + } + } + void prevImage() async { await pageController.previousPage( duration: FluffyThemes.animationDuration, diff --git a/lib/pages/image_viewer/image_viewer_view.dart b/lib/pages/image_viewer/image_viewer_view.dart index c6a0b8835..997a9e6f9 100644 --- a/lib/pages/image_viewer/image_viewer_view.dart +++ b/lib/pages/image_viewer/image_viewer_view.dart @@ -69,25 +69,29 @@ class ImageViewerView extends StatelessWidget { body: HoverBuilder( builder: (context, hovered) => Stack( children: [ - PageView.builder( - controller: controller.pageController, - itemCount: controller.allEvents.length, - itemBuilder: (context, i) => InteractiveViewer( - minScale: 1.0, - maxScale: 10.0, - onInteractionEnd: controller.onInteractionEnds, - child: Center( - child: Hero( - tag: controller.allEvents[i].eventId, - child: GestureDetector( - // Ignore taps to not go back here: - onTap: () {}, - child: MxcImage( - key: ValueKey(controller.allEvents[i].eventId), - event: controller.allEvents[i], - fit: BoxFit.contain, - isThumbnail: false, - animated: true, + KeyboardListener( + focusNode: controller.focusNode, + onKeyEvent: controller.onKeyEvent, + child: PageView.builder( + controller: controller.pageController, + itemCount: controller.allEvents.length, + itemBuilder: (context, i) => InteractiveViewer( + minScale: 1.0, + maxScale: 10.0, + onInteractionEnd: controller.onInteractionEnds, + child: Center( + child: Hero( + tag: controller.allEvents[i].eventId, + child: GestureDetector( + // Ignore taps to not go back here: + onTap: () {}, + child: MxcImage( + key: ValueKey(controller.allEvents[i].eventId), + event: controller.allEvents[i], + fit: BoxFit.contain, + isThumbnail: false, + animated: true, + ), ), ), ),